gflow-cli 0.22.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 (506) hide show
  1. gflow_cli-0.24.0/.claude/commands/gflow/issue-assessment.md +28 -0
  2. gflow_cli-0.24.0/.claude/commands/gflow/issue-resolve.md +18 -0
  3. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/ci.yml +5 -2
  4. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/AGENTS.md +9 -0
  5. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CHANGELOG.md +70 -1
  6. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/GEMINI.md +1 -1
  7. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/KNOWN_ISSUES.md +22 -0
  8. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/PKG-INFO +2 -2
  9. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/PLAN.md +1 -1
  10. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/INDEX.md +1 -2
  11. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.22.0.md +36 -2
  12. gflow_cli-0.24.0/docs/LIVE_VERIFICATION_v0.23.0.md +76 -0
  13. gflow_cli-0.24.0/docs/LIVE_VERIFICATION_v0.24.0.md +38 -0
  14. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/MCP.md +4 -4
  15. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/PROJECT_STATUS.md +32 -1
  16. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/USAGE.md +29 -6
  17. gflow_cli-0.24.0/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +143 -0
  18. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/pyproject.toml +3 -3
  19. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_patchright.py +9 -2
  20. gflow_cli-0.24.0/skills/issue-assessment/SKILL.md +142 -0
  21. gflow_cli-0.24.0/skills/issue-resolve/SKILL.md +123 -0
  22. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/__init__.py +1 -1
  23. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/_cli_helpers.py +21 -0
  24. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/client.py +224 -4
  25. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation.py +10 -9
  26. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/cookies.py +36 -3
  27. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/browser_manager.py +112 -12
  28. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli.py +21 -1
  29. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_image.py +6 -19
  30. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_video.py +66 -25
  31. gflow_cli-0.24.0/src/gflow_cli/mcp/tools.py +832 -0
  32. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/daemon.py +132 -34
  33. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_image.py +47 -0
  34. gflow_cli-0.24.0/tests/api/test_client_launch_kwargs.py +355 -0
  35. gflow_cli-0.24.0/tests/auth/test_cookies.py +107 -0
  36. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video.py +187 -29
  37. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_helpers.py +10 -1
  38. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/dev/test_recording_client.py +1 -0
  39. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/test_server.py +106 -18
  40. gflow_cli-0.24.0/tests/mcp/test_tools_helpers.py +149 -0
  41. gflow_cli-0.24.0/tests/mcp/test_tools_wired.py +534 -0
  42. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_browser_manager.py +89 -0
  43. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/worker/test_daemon.py +138 -19
  44. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/uv.lock +25 -25
  45. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +0 -117
  46. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +0 -110
  47. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +0 -66
  48. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +0 -233
  49. gflow_cli-0.22.0/src/gflow_cli/mcp/tools.py +0 -340
  50. gflow_cli-0.22.0/tests/api/test_client_launch_kwargs.py +0 -77
  51. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/README.md +0 -0
  52. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/active.md +0 -0
  53. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/branch-review.md +0 -0
  54. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/changelog.md +0 -0
  55. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/check.md +0 -0
  56. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/doc-review.md +0 -0
  57. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/known-issues.md +0 -0
  58. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/next.md +0 -0
  59. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/plan.md +0 -0
  60. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  61. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/predict.md +0 -0
  62. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/release.md +0 -0
  63. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/scenario.md +0 -0
  64. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/sonar.md +0 -0
  65. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/status.md +0 -0
  66. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.env.template +0 -0
  67. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.gitattributes +0 -0
  68. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/CODEOWNERS +0 -0
  69. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  70. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/copilot-instructions.md +0 -0
  71. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/dependabot.yml +0 -0
  72. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/external-pr-triage.yml +0 -0
  73. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/governance-advisory.yml +0 -0
  74. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/governance-benchmark.yml +0 -0
  75. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/main-base-guard.yml +0 -0
  76. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/release.yml +0 -0
  77. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.gitignore +0 -0
  78. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.gitleaks.toml +0 -0
  79. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.pre-commit-config.yaml +0 -0
  80. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.secrets.baseline +0 -0
  81. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CLAUDE.md +0 -0
  82. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CONFIGURATION.md +0 -0
  83. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CONTRIBUTING.md +0 -0
  84. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/DISCLAIMER.md +0 -0
  85. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/LICENSE +0 -0
  86. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/README.md +0 -0
  87. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/RELEASE.md +0 -0
  88. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/ROADMAP.md +0 -0
  89. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/conftest.py +0 -0
  90. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docker-compose.yml +0 -0
  91. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AGENT_GUIDE.md +0 -0
  92. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AGENT_UI_E2E.md +0 -0
  93. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AGENT_UI_RECON.md +0 -0
  94. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/ARCHITECTURE.md +0 -0
  95. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AUTHENTICATION.md +0 -0
  96. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/CHARACTER.md +0 -0
  97. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/CHARACTER_RECON.md +0 -0
  98. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/CONFIGURATION.md +0 -0
  99. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DATA_LAYER.md +0 -0
  100. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DEBUGGING.md +0 -0
  101. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DEMOS.md +0 -0
  102. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DEVELOPMENT.md +0 -0
  103. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/E2E_TESTING.md +0 -0
  104. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/EXTERNAL_STORAGE.md +0 -0
  105. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/GITHUB.md +0 -0
  106. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  107. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  108. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  109. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  110. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  111. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  112. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  113. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  114. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  115. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  116. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  117. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  118. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  119. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  120. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  121. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  122. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  123. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  124. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  125. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  126. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/MOVIE.md +0 -0
  127. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/PROMPT_EXPANSION.md +0 -0
  128. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/SECURITY.md +0 -0
  129. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/TOOLS.md +0 -0
  130. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/USER_GUIDE.md +0 -0
  131. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/assets/demo-split-pf.gif +0 -0
  132. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/assets/example-run.gif +0 -0
  133. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/assets/examples.webp +0 -0
  134. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/medium_tutorial.md +0 -0
  135. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/schemas/movie-handoff.schema.json +0 -0
  136. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/sonar-cleanup-tracker.md +0 -0
  137. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  138. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  139. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  140. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  141. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  142. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  143. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  144. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  145. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  146. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  147. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  148. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/README.md +0 -0
  149. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/batch_from_config.py +0 -0
  150. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/multi_prompt_t2i.py +0 -0
  151. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/sample_config.json +0 -0
  152. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/sample_prompts.txt +0 -0
  153. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/single_image_t2i.py +0 -0
  154. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/workflow_chain.py +0 -0
  155. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/llms.txt +0 -0
  156. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/README.md +0 -0
  157. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/01_upload_image.json +0 -0
  158. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  159. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  160. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/04_archive_workflow.json +0 -0
  161. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/05_createProject.json +0 -0
  162. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/06_batchGenerateImages.json +0 -0
  163. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  164. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  165. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  166. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  167. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  168. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/12_create_scene.json +0 -0
  169. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  170. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/14_get_scene_workflows.json +0 -0
  171. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  172. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/ci/check_doc_links.py +0 -0
  173. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/ci/check_materiality.py +0 -0
  174. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/ci/check_repo_hygiene.py +0 -0
  175. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/debug_editor.py +0 -0
  176. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/debug_gen_settings.py +0 -0
  177. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/debug_settings.py +0 -0
  178. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/_recording_client.py +0 -0
  179. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/_spike_common.py +0 -0
  180. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/active_plan.py +0 -0
  181. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  182. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  183. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  184. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  185. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  186. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  187. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_locale_invariants.py +0 -0
  188. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  189. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike.py +0 -0
  190. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike_v2.py +0 -0
  191. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/dump_character_selectors.js +0 -0
  192. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/make_project.py +0 -0
  193. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/materiality_backtest.py +0 -0
  194. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/monitor_pr_38.py +0 -0
  195. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/patch_character.py +0 -0
  196. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/README.md +0 -0
  197. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/harness.py +0 -0
  198. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/tasks.json +0 -0
  199. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  200. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  201. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  202. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  203. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  204. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  205. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  206. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  207. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  208. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  209. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  210. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  211. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  212. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_patch_entity.py +0 -0
  213. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/README.md +0 -0
  214. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/capture_flow_traffic.py +0 -0
  215. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/memory_profile.py +0 -0
  216. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/recaptcha_mint.py +0 -0
  217. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  218. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  219. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/record_demo.ps1 +0 -0
  220. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_image.py +0 -0
  221. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_real_chrome_image.py +0 -0
  222. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_video_editor.py +0 -0
  223. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_worker_style.py +0 -0
  224. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/verify_chrome_auth_viability.py +0 -0
  225. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/README.md +0 -0
  226. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/gflow-cli/SKILL.md +0 -0
  227. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/plan/SKILL.md +0 -0
  228. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/pr-council-review/SKILL.md +0 -0
  229. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/predict/SKILL.md +0 -0
  230. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/scenario/SKILL.md +0 -0
  231. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/status/SKILL.md +0 -0
  232. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/sonar-project.properties +0 -0
  233. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/__main__.py +0 -0
  234. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/__init__.py +0 -0
  235. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_engine.py +0 -0
  236. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_retry.py +0 -0
  237. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  238. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/character.py +0 -0
  239. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/dto.py +0 -0
  240. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image.py +0 -0
  241. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image_upscale.py +0 -0
  242. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/recaptcha.py +0 -0
  243. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/routes.py +0 -0
  244. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/scene.py +0 -0
  245. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  246. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_common.py +0 -0
  247. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  248. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/base.py +0 -0
  249. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  250. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  251. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  252. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  253. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  254. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  255. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  256. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  257. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  258. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  259. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/video.py +0 -0
  260. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/__init__.py +0 -0
  261. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/base.py +0 -0
  262. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/factory.py +0 -0
  263. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  264. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  265. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/strategies.py +0 -0
  266. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/verification.py +0 -0
  267. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/chain.py +0 -0
  268. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/chain_manifest.py +0 -0
  269. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_character.py +0 -0
  270. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_data.py +0 -0
  271. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_models.py +0 -0
  272. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_movie.py +0 -0
  273. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_run.py +0 -0
  274. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_scene.py +0 -0
  275. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_tools.py +0 -0
  276. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/composition.py +0 -0
  277. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/config.py +0 -0
  278. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/__init__.py +0 -0
  279. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/chain_repo.py +0 -0
  280. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  281. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  282. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  283. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  284. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  285. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  286. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  287. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  288. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  289. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/models.py +0 -0
  290. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/queries.py +0 -0
  291. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/recorder.py +0 -0
  292. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/redaction.py +0 -0
  293. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/repository.py +0 -0
  294. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/store.py +0 -0
  295. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/errors.py +0 -0
  296. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/exceptions.py +0 -0
  297. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/image_batch.py +0 -0
  298. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/json_output.py +0 -0
  299. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/manifest.py +0 -0
  300. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/__init__.py +0 -0
  301. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/prompts.py +0 -0
  302. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/resources.py +0 -0
  303. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/server.py +0 -0
  304. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/media.py +0 -0
  305. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/movie_manifest.py +0 -0
  306. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/observability.py +0 -0
  307. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/paths.py +0 -0
  308. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/profile_store.py +0 -0
  309. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/services/__init__.py +0 -0
  310. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/services/character_create.py +0 -0
  311. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/storage.py +0 -0
  312. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/__init__.py +0 -0
  313. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/banned.py +0 -0
  314. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  315. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  316. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/expander.py +0 -0
  317. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/invocation.py +0 -0
  318. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/loader.py +0 -0
  319. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/registry.py +0 -0
  320. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/runtime.py +0 -0
  321. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/spec.py +0 -0
  322. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/app.py +0 -0
  323. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/server.py +0 -0
  324. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/queue.py +0 -0
  325. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tasks/lessons.md +0 -0
  326. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/test_assets/sample_batch.json +0 -0
  327. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/test_assets/sample_batch.tsv +0 -0
  328. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/test_assets/sample_batch_invalid.tsv +0 -0
  329. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/__init__.py +0 -0
  330. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/__init__.py +0 -0
  331. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/fixtures/character_gen_response.json +0 -0
  332. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  333. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  334. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  335. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_bearer_redaction.py +0 -0
  336. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_character.py +0 -0
  337. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client.py +0 -0
  338. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_character.py +0 -0
  339. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_delete_characters.py +0 -0
  340. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_generate_character.py +0 -0
  341. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_patch_entity.py +0 -0
  342. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_scene.py +0 -0
  343. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_upscale.py +0 -0
  344. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_concurrency.py +0 -0
  345. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_dto.py +0 -0
  346. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_engine.py +0 -0
  347. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_image.py +0 -0
  348. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_image_dto.py +0 -0
  349. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_image_upscale.py +0 -0
  350. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  351. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_recaptcha.py +0 -0
  352. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_retry.py +0 -0
  353. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_routes.py +0 -0
  354. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_routes_character.py +0 -0
  355. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_routes_scene.py +0 -0
  356. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_sapisidhash_helper.py +0 -0
  357. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_scene_models.py +0 -0
  358. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_video.py +0 -0
  359. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_video_request.py +0 -0
  360. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/__init__.py +0 -0
  361. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/conftest.py +0 -0
  362. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/__init__.py +0 -0
  363. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  364. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_factory.py +0 -0
  365. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_base.py +0 -0
  366. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_bearer.py +0 -0
  367. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_common.py +0 -0
  368. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  369. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_factory.py +0 -0
  370. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_fingerprint.py +0 -0
  371. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_sapisidhash.py +0 -0
  372. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_transport_timeout.py +0 -0
  373. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation.py +0 -0
  374. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  375. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  376. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  377. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  378. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_factory.py +0 -0
  379. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_strategies.py +0 -0
  380. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/auth/test_verification.py +0 -0
  381. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/__init__.py +0 -0
  382. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_auth_list.py +0 -0
  383. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character.py +0 -0
  384. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character_create.py +0 -0
  385. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_data.py +0 -0
  386. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image.py +0 -0
  387. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  388. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  389. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_upscale.py +0 -0
  390. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_models.py +0 -0
  391. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_movie.py +0 -0
  392. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_run.py +0 -0
  393. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_scene.py +0 -0
  394. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_tools.py +0 -0
  395. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video_chain.py +0 -0
  396. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_error_handling.py +0 -0
  397. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_movie_manifest.py +0 -0
  398. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_settings_validation.py +0 -0
  399. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  400. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/composition/test_character.py +0 -0
  401. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/composition/test_compose_prompt.py +0 -0
  402. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/composition/test_handoff.py +0 -0
  403. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/conftest.py +0 -0
  404. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/__init__.py +0 -0
  405. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_chain_repo.py +0 -0
  406. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_find_incomplete_character.py +0 -0
  407. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_models.py +0 -0
  408. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_packaging.py +0 -0
  409. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_recorder.py +0 -0
  410. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_recorder_character.py +0 -0
  411. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_redaction.py +0 -0
  412. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_repository.py +0 -0
  413. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_scene_persistence.py +0 -0
  414. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_settings_and_errors.py +0 -0
  415. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_store_migrations.py +0 -0
  416. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/__init__.py +0 -0
  417. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/conftest.py +0 -0
  418. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  419. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  420. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_chain_e2e.py +0 -0
  421. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_character_create_e2e.py +0 -0
  422. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_daemon_e2e.py +0 -0
  423. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  424. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  425. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  426. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  427. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_json_output_e2e.py +0 -0
  428. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  429. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_scene_compose_live.py +0 -0
  430. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_tools_e2e.py +0 -0
  431. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_transports_e2e.py +0 -0
  432. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  433. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  434. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/__init__.py +0 -0
  435. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/auth.feature +0 -0
  436. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/auth_login.feature +0 -0
  437. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/character_create.feature +0 -0
  438. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/character_read.feature +0 -0
  439. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/conftest.py +0 -0
  440. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/image.feature +0 -0
  441. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/image_upscale.feature +0 -0
  442. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/locale_picker_include.feature +0 -0
  443. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_auth_login_steps.py +0 -0
  444. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_auth_steps.py +0 -0
  445. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_character_create_steps.py +0 -0
  446. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_character_read_steps.py +0 -0
  447. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_image_steps.py +0 -0
  448. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_image_upscale_steps.py +0 -0
  449. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  450. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_step_collision_guard.py +0 -0
  451. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  452. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_video_chain_steps.py +0 -0
  453. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/video_agent_ui.feature +0 -0
  454. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/video_chain.feature +0 -0
  455. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/fixtures/__init__.py +0 -0
  456. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/fixtures/seeded_catalog.py +0 -0
  457. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/image_batch/__init__.py +0 -0
  458. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/image_batch/test_image_manifest.py +0 -0
  459. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/image_batch/test_observability_events.py +0 -0
  460. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/__init__.py +0 -0
  461. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/conftest.py +0 -0
  462. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/constants.py +0 -0
  463. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/test_storage_gcs.py +0 -0
  464. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/test_storage_s3.py +0 -0
  465. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/__init__.py +0 -0
  466. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/conftest.py +0 -0
  467. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/test_stdio_transport.py +0 -0
  468. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  469. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  470. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_check_materiality.py +0 -0
  471. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  472. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_materiality_backtest.py +0 -0
  473. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/__init__.py +0 -0
  474. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/test_character_create_redaction.py +0 -0
  475. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/test_character_create_saga.py +0 -0
  476. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  477. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/smoke/__init__.py +0 -0
  478. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  479. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/smoke/test_real_flow.py +0 -0
  480. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_auth.py +0 -0
  481. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_chain.py +0 -0
  482. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_chain_manifest.py +0 -0
  483. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_cli_data.py +0 -0
  484. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_config.py +0 -0
  485. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_conftest_isolation.py +0 -0
  486. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_data_queries.py +0 -0
  487. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_documentation_gate.py +0 -0
  488. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_errors.py +0 -0
  489. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_errors_403.py +0 -0
  490. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_json_output.py +0 -0
  491. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_manifest.py +0 -0
  492. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_marker_registry.py +0 -0
  493. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_media.py +0 -0
  494. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_observability.py +0 -0
  495. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_paths.py +0 -0
  496. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_profile_store.py +0 -0
  497. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_smoke.py +0 -0
  498. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/__init__.py +0 -0
  499. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_banned.py +0 -0
  500. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_expander.py +0 -0
  501. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_invocation.py +0 -0
  502. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_loader.py +0 -0
  503. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_registry.py +0 -0
  504. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_runtime.py +0 -0
  505. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_spec.py +0 -0
  506. {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/ui/test_app.py +0 -0
@@ -0,0 +1,28 @@
1
+ ---
2
+ description: >
3
+ Triage a gflow-cli GitHub issue: verify the reporter's claim against code,
4
+ tests, docs, KNOWN_ISSUES, and memory; classify it (CONFIRMED / NEEDS-E2E /
5
+ NEEDS-INFO / DUPLICATE / INVALID / WONTFIX); judge whether it is verifiable
6
+ end-to-end in the current environment; and draft a reporter-facing reply.
7
+ Read-only — changes nothing and posts nothing on its own.
8
+ ---
9
+
10
+ # `/gflow:issue-assessment [issue number or URL]`
11
+
12
+ **Read `skills/issue-assessment/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the issue to assess.
13
+
14
+ > Do **not** call `Skill(skill="issue-assessment")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not Skill-tool-invocable (only `.claude/commands/gflow/*` are). Read the file directly instead.
15
+
16
+ The skill at `skills/issue-assessment/SKILL.md` ingests the issue, verifies the
17
+ claim (dispatching a search agent to keep context clean), assigns one verdict,
18
+ applies the **e2e-gate** (never claim a fix is verified on an unverifiable
19
+ surface), and emits a standard report artifact. On a `CONFIRMED` / `LIKELY-BUG`
20
+ verdict with localized, verifiable scope it hands off to `issue-resolve`;
21
+ otherwise it replies only.
22
+
23
+ **Typical chain:**
24
+ ```
25
+ /gflow:issue-assessment <N> → verdict + e2e-gate + reply artifact
26
+ ↓ (if scope clear & verifiable)
27
+ issue-resolve <N> → worktree + TDD + draft PR for human review
28
+ ```
@@ -0,0 +1,18 @@
1
+ ---
2
+ description: >
3
+ Drive an assessed gflow-cli issue (verdict CONFIRMED-BUG or LIKELY-BUG, with
4
+ localized verifiable scope) to a fix: isolated worktree off develop, test-first
5
+ fix, /gflow:check, then a DRAFT PR for human review. Mutating and gated — runs
6
+ inside a strict action envelope (never merges, never spends credits, never
7
+ marks a PR ready, never claims an unverified fix verified).
8
+ ---
9
+
10
+ # `/gflow:issue-resolve [issue number]`
11
+
12
+ **Read `skills/issue-resolve/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the issue to resolve.
13
+
14
+ > Do **not** call `Skill(skill="issue-resolve")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not Skill-tool-invocable (only `.claude/commands/gflow/*` are). Read the file directly instead.
15
+
16
+ Preconditions (from `/gflow:issue-assessment`): verdict ∈ {`CONFIRMED-BUG`, `LIKELY-BUG`}, scope single-surface, and the fix is verifiable in this environment (or the gap is carried into the PR as "needs human e2e"). The skill isolates a `bugfix/` worktree off `develop`, gates high-stakes changes through `/gflow:predict` + `/gflow:scenario`, fixes test-first (Opus plans → Sonnet codes → Opus reviews for non-trivial work), runs `/gflow:check`, opens a **draft** PR with a Verification-status section, runs `/gflow:pr-council-review`, and **stops** for a human to promote and merge.
17
+
18
+ **Chain:** `/gflow:issue-assessment <N>` → (if scope clear) `/gflow:issue-resolve <N>` → human promotes draft → human runs any headed/e2e check → merge.
@@ -93,10 +93,13 @@ jobs:
93
93
  runs-on: ubuntu-latest
94
94
  needs: test # wait for tests + coverage report
95
95
  # Forked pull_request runs do not receive repository secrets, so SONAR_TOKEN
96
- # is empty there and the scanner fails before analysis. Keep SonarCloud on
97
- # trusted pushes/internal PRs where the token is available.
96
+ # is empty there and the scanner fails before analysis. Dependabot-triggered
97
+ # runs are the same case: GitHub serves them the separate Dependabot secrets
98
+ # namespace, so SONAR_TOKEN is also empty even though the branch is in-repo.
99
+ # Keep SonarCloud on trusted pushes/internal PRs where the token is available.
98
100
  if: >
99
101
  always() &&
102
+ github.actor != 'dependabot[bot]' &&
100
103
  (
101
104
  github.event_name != 'pull_request' ||
102
105
  github.event.pull_request.head.repo.full_name == github.repository
@@ -69,6 +69,15 @@ Or invoke the wrapper: `/gflow:check`.
69
69
  - Run `/gflow:check` (or the Impeccable Routine) before every commit.
70
70
  - All releases require a signed annotated tag (`git tag -s vX.Y.Z`); CI rejects unsigned tags.
71
71
 
72
+ ## Working discipline — verify before you act
73
+
74
+ These rules exist because docs alone don't bind under momentum: a "check open PRs first" rule was already written and still got skipped, and a PR was merged without seeing an entangled open one. Follow them on every task.
75
+
76
+ - **Check what's already in flight before coding a fix, opening a PR, or merging.** Run `gh pr list` and `git ls-remote` first — another open PR may already touch the same issue or files. Reconcile against it; don't re-derive "the only thing left" from a stale handoff. (A `PreToolUse` hook also surfaces same-issue open PRs at `gh pr create`/`merge` time, but treat that as a backstop, not a substitute for looking.)
77
+ - **Truth is the CLI and running the code — not IDE/LSP "reminder" diagnostics.** Editor / `pyright`-in-worktree warnings go stale for an entire session and throw false positives (especially across multiple worktrees). Confirm with `ruff` / `pyright` / `pytest` from the terminal — or trust the worktree's own venv — never an IDE squiggle.
78
+ - **Verify third-party runtime behavior empirically before wiring it in.** Don't assume how an external library, API, or browser actually behaves — exercise it once and observe, then build on the observed contract.
79
+ - **If a claim can't be verified in the current environment, it's LIKELY — not CONFIRMED.** Keep the issue open, reference it with `Refs #N` (not `Closes #N`), and ship diagnostics rather than a blind fix. When you can't reproduce it, hand the fix to whoever can.
80
+
72
81
  ## Skills reference (cross-tool)
73
82
 
74
83
  The `skills/` directory ships installable agent skill docs in plain Markdown with YAML frontmatter. Any agent can consume them directly:
@@ -7,6 +7,73 @@ 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
+
23
+ ## [0.23.0] — 2026-07-01
24
+
25
+ ### Added
26
+
27
+ - **MCP generation is now functional (#228)**: the `gflow_generate_image` and
28
+ `gflow_generate_video` MCP tools — previously non-functional stubs — now enqueue onto
29
+ the FlowWorker queue and run end-to-end, with the background worker owning download and
30
+ history recording. The `tools` parameter (e.g. `creative-director`) is now applied to
31
+ expand the prompt before generation (it was previously accepted but never applied), and
32
+ reference images are supported across the image (`i2i`) and video (`i2v` / `r2v`) tools.
33
+
34
+ ### Fixed
35
+
36
+ - **macOS generation 401 — resolved (#222, #230)**: Flow cookies are now read from the
37
+ full cookie jar filtered by domain instead of a path-`/` URL filter that silently
38
+ dropped the `/fx`-scoped `__Secure-next-auth.session-token`; and on macOS — where the
39
+ headed generation context can intermittently fail to decrypt the on-disk cookie store —
40
+ the session is seeded into the context from a snapshot captured pre-launch via the
41
+ working `--password-store=basic` reader. Verified end-to-end on macOS (Apple Silicon) by
42
+ the reporter. Thanks @gunalak.
43
+ - **MCP video task safety (#228)**: `i2v` now requires `initial_frame` and `r2v` requires
44
+ `reference_images`, validated at the tool boundary with a clear error; a post-success
45
+ recording failure no longer flips a credit-spent video to `failed`; and any
46
+ non-`completed` task status is reported as a failure rather than a false success.
47
+ - **Chrome channel on Chromium-only hosts**: `channel_for_profile()` now gates
48
+ Playwright's `channel="chrome"` on a new `_is_playwright_chrome_channel_available()`
49
+ check that probes only the exact Google-Chrome paths Playwright hardcodes, instead
50
+ of `is_chrome_available()` (which also accepts Chromium). On a host with only
51
+ Chromium installed, the CLI no longer requests `channel="chrome"` and fails with
52
+ `Chromium distribution 'chrome' is not found at /opt/google/chrome/chrome`; it falls
53
+ back to bundled Chromium and logs an actionable warning (#219).
54
+ - **Text-to-image extra-image billing**: the generation-settings trigger selector now
55
+ requires `button[aria-haspopup='menu']` (aliased to `MODE_SWITCH_TRIGGER_SELECTORS`),
56
+ preventing a mis-click on an icon-only aspect thumbnail that skipped the count panel
57
+ and left Flow's own default count (typically 2) in effect — billing extra generations
58
+ while the CLI saved only one (#219).
59
+ - **Extra-image observability**: `generate_image()` now logs a
60
+ `client.generate_image_extra_returned` warning when the transport returns more images
61
+ than the requested `count=1`, so silent over-generation is surfaced to the user (#219).
62
+ - **macOS generation 401 — fail loud (#222)**: a `chrome`-strategy profile that is
63
+ silently downgraded to bundled Chromium at generation launch now raises instead of
64
+ running logged-out, so the macOS auth failure surfaces at its cause rather than as an
65
+ opaque later `401`.
66
+
67
+ ### Diagnostics
68
+
69
+ - **Persistent-context cookie state (#222)**: generation launch now logs the resolved
70
+ `cookies_db_path` (`client.persistent_context_launch`) and the launched context's own
71
+ cookie state (`client.context_cookie_state`: `flow_session_cookie_present` / count /
72
+ expiry — **never values**, safe to paste publicly). This splits a cookie-**load**
73
+ failure (the macOS persistent context cannot decrypt the profile's cookies) from a
74
+ server-side rejection — the observability that localized the macOS `401` root cause,
75
+ now resolved (see the #222/#230 entry above).
76
+
10
77
  ## [0.22.0] — 2026-06-28
11
78
 
12
79
  ### Added
@@ -1628,7 +1695,9 @@ shell-script template that branches on these codes.
1628
1695
 
1629
1696
  First skeleton. Not functional end-to-end yet.
1630
1697
 
1631
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.22.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
1700
+ [0.23.0]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...v0.23.0
1632
1701
  [0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
1633
1702
  [0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
1634
1703
  [0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
@@ -25,7 +25,7 @@
25
25
 
26
26
  ## Active phase
27
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).
28
+ - **Decoupled Daemon/Worker Plan:** The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). The remaining headless SSE Daemon + Tauri/React editor blueprint is scheduled in [gflow-studio-scaffold/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md) and [rest-api-layer/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md).
29
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
30
 
31
31
  See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
@@ -14,6 +14,28 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
14
14
 
15
15
  ## Open
16
16
 
17
+ ### macOS: generation runs logged-out → HTTP 401, even with `--browser chrome`
18
+
19
+ - **Status:** **RESOLVED in v0.23.0** ([#222](https://github.com/ffroliva/gflow-cli/issues/222),
20
+ fixed by [#230](https://github.com/ffroliva/gflow-cli/pull/230), @gunalak)
21
+ - **Severity:** High · **Affected:** all `gflow` generation on **macOS** with a
22
+ `chrome`-strategy profile; Windows was unaffected
23
+
24
+ On macOS, generation calls failed with **HTTP 401** (`AuthExpiredError` at
25
+ `project.createProject`) on a profile that `gflow auth login` and verification
26
+ accepted. Two corrections fixed it (verified end-to-end on macOS Apple Silicon):
27
+
28
+ 1. **Cookie-read bug (unconditional).** The Flow cookie snapshot read the jar via
29
+ `ctx.cookies(["https://labs.google"])`, whose path-`/` filter silently dropped
30
+ the `/fx`-scoped `__Secure-next-auth.session-token`. Now the full jar is read
31
+ and filtered by domain, so the session token is captured.
32
+ 2. **macOS headed-context decrypt (intermittent).** When the headed generation
33
+ context can't decrypt the on-disk store, the session is seeded from a snapshot
34
+ captured **pre-launch** via the working `--password-store=basic` reader. No-op on
35
+ Windows and on runs where the context decrypts natively.
36
+
37
+ Evidence: [LIVE_VERIFICATION_v0.23.0](docs/LIVE_VERIFICATION_v0.23.0.md).
38
+
17
39
  ### Flow's new full-page media-library UI breaks entity attach (A/B rollout)
18
40
 
19
41
  - **Status:** **Open** — Flow-side staged rollout; tracked in
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.22.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
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
58
58
  Requires-Dist: pyright>=1.1.0; extra == 'dev'
59
59
  Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
60
60
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
61
- Requires-Dist: ruff==0.15.18; extra == 'dev'
61
+ Requires-Dist: ruff==0.15.20; extra == 'dev'
62
62
  Provides-Extra: gcs
63
63
  Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
64
64
  Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
@@ -366,7 +366,7 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
366
366
  - **`expand_prompt` reconcile — DONE 2026-06-28 (PR #215).** The legacy `mcp/prompts.py` `expand_prompt` MCP prompt is **deprecated** in favor of the `creative-director` tool (client-visible `[DEPRECATED]` marker; kept functional; removal slated for a future major). See [PROMPT_EXPANSION § Relationship to expand_prompt](file:///C:/development/github/gflow-cli/docs/PROMPT_EXPANSION.md).
367
367
  - **My Tools — DONE 2026-06-28 (PR #216).** User-authored TOMLs in `<GFLOW_CLI_HOME>/tools/*.toml` are loaded into the registry (override-a-builtin-with-warning; malformed fails loud).
368
368
  - **Backlog — deferred by design:** the S3 `Tool.apply(ctx)→outcome` dispatch framework. The research doc gates it on a *second, non-prompt* tool (e.g. Mockup) — building it now with a single prompt-only implementer is the documented "premature uniformity (guessed contract)" anti-pattern.
369
- - [ ] **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).
369
+ - [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog) The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). Remaining: a local FastAPI/React filmmaking studio dashboard + HTTP/SSE MCP. Planned in [gflow-studio-scaffold/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md) and [rest-api-layer/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md).
370
370
  - [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.
371
371
  - [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]]`.
372
372
  - **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]]`.
@@ -37,7 +37,6 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
37
37
  | **[docs/TOOLS.md](TOOLS.md)** | Tools framework: the `gflow tools list/show/run` group, the `--tool/-t` option on generation commands, the TOML tool schema, how a tool is defined, "My Tools" user-authored tools, MCP exposure + §61 parity | Working on `gflow_cli.tools`, adding a built-in or user tool, or wiring `--tool` into a command |
38
38
  | **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (HTTP/SSE), the tools/prompts/resources surface, CLI↔MCP §61 parity, security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/SSE transports |
39
39
  | **[docs/PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)** | The `creative-director` tool: 5-component formula, 15 domain styles, banned-keyword policy, Gemini endpoint + I/O, never-fatal contract, `expanded_prompt` + `metadata_json.tool` provenance/redaction, config | Using or debugging `--tool creative-director`, editing the tool TOML, or auditing recorded prompt provenance |
40
- | **[docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md](superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md)** | Integrated local Filmmaking Studio Web UI, Flow Worker queue daemon, and MCP SSE server design spec (HLD/LLD) | Understanding the integrated HTTP/SSE daemon architecture |
41
40
  | **[docs/IMAGE_UPSCALE_RECON.md](IMAGE_UPSCALE_RECON.md)** | `gflow image upscale` wire protocol: `upsampleImage` endpoint, full clientContext (projectId/sessionId/tool/userPaygateTier), reCAPTCHA action `IMAGE_GENERATION`, inline base64 response, 4K Ultra-gating, REST-is-dead proof | Working on `gflow image upscale`, debugging the 403/reCAPTCHA path, or understanding Flow's image-upscale wire protocol (#171) |
42
41
  | **[docs/AGENT_UI_RECON.md](AGENT_UI_RECON.md)** | Agentic Flow UI cohort: classic-vs-agentic DOM signature, server-side + volatile (flapping) A/B gating (no client-readable flag), why `_exit_agent_mode` fails, runtime-DOM-detection recommendation | Touching `_exit_agent_mode` / composer mode-switch, diagnosing exit 23 selector drift, or understanding Flow's agentic-UI A/B (#183/#174) |
43
42
  | **[tasks/lessons.md](../tasks/lessons.md)** | Running notebook of patterns + reviewer findings, dated and traced to commits | Starting a new phase; debugging "why did the council flag this?" |
@@ -118,7 +117,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
118
117
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
119
118
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
120
119
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
121
- **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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). Prior: [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)
122
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.
123
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)
124
123
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -82,5 +82,39 @@ Owner checklist (run after publish, then fill **Post-tag evidence**):
82
82
 
83
83
  ## Post-tag evidence
84
84
 
85
- _(fill after the owner live run: the 5-layer ledger command, exit code, catalog row JSON,
86
- structlog events, and a user-confirmable artifact.)_
85
+ ### Tool / expander / My-Tools live-verified 2026-06-28 (real Gemini API)
86
+
87
+ Run with the owner's `GFLOW_CLI_GEMINI_API_KEY` (from `.env.local`), CLI v0.22.0:
88
+
89
+ | # | Check | Command | Result |
90
+ |---|---|---|---|
91
+ | 1 | Tool registered | `gflow tools list` | `creative-director` listed (Title/Category/Description correct) ✅ |
92
+ | 2 | Real expansion | `gflow tools run creative-director "a cat on a couch" --style cinema --json` | `was_expanded: true`; 16→1189 chars; vivid 5-component prose naming a real camera (Sony A7R IV / Cooke S7/i) + prestige anchor (Kinfolk); structlog `prompt_expanded` (model `gemini-2.5-flash`) ✅ |
93
+ | 3 | Banned-keyword guarantee | `gflow tools run creative-director "a luxury watch" --style product` | output scanned against all 13 banned terms → **none present** ✅ |
94
+ | 4 | Never-fatal (bad key) | `GFLOW_CLI_GEMINI_API_KEY=invalid-key-xyz gflow tools run creative-director "a dog" --json` | `was_expanded: false`, original returned, no error/exit ✅ |
95
+ | 5 | Video category style | `gflow tools run creative-director "a city at night" --style cinematic` | rewrites with cinematic vocabulary (video-gated style resolves) ✅ |
96
+ | 6 | "My Tools" loader | wrote `<HOME>/tools/haiku-bot.toml`; `GFLOW_CLI_HOME=<tmp> gflow tools list` | user tool `haiku-bot` listed **alongside** the builtin `creative-director` ✅ |
97
+
98
+ These exercise the whole prompt-tool path (registry → `apply_tool` → `build_instruction` → live
99
+ `PromptExpander.expand` → `strip_banned_keywords`), the never-fatal contract, category gating, and
100
+ the user-dir loader — end to end against the real Gemini endpoint.
101
+
102
+ ### Generation recording (`expanded_prompt` + `metadata_json.tool` + redaction) — ✅ live-verified 2026-06-28
103
+
104
+ Real credit-free `image t2i` generations on the authenticated `denon82` profile (agentic UI
105
+ cohort, model NARWHAL), CLI v0.22.0:
106
+
107
+ **Store mode** — `gflow image t2i "a fox in the snow" --tool creative-director:style=cinema --profile denon82`:
108
+ - File: a real **729 KB JPEG** (magic bytes `ff d8 ff`) written to the `--out` dir ✅
109
+ - `prompt` = `"a fox in the snow"` (the **original**) ✅
110
+ - `expanded_prompt` = the 971-char rewrite (`"A sleek, mature red fox, …"`) ✅
111
+ - `operations.metadata_json.tool` = `{name: "creative-director", version: "1", model: "gemini-2.5-flash", params: {style: "cinema"}, config_hash: "e8399085…"}` ✅
112
+
113
+ **Redacted mode** — same command with `GFLOW_CLI_HISTORY_PROMPTS=redacted` (`"a red barn at dusk"`):
114
+ - `prompt` = `None`, `prompt_redacted` = `1`, `expanded_prompt` = `None` (both withheld) ✅
115
+ - `metadata_json.tool` = `{name, version, params_hash, config_hash}` only — no `model`, no raw
116
+ `params` (replaced by `params_hash`) ✅
117
+ - `config_hash` identical to store mode (same resolved `ToolConfig`) — tamper-evidence confirmed ✅
118
+
119
+ **All 5 ledger layers cleared** (file + magic bytes + real generation + DB rows in both prompt
120
+ modes + structlog `prompt_expanded`/`ui_driver.bound`). v0.22.0 live verification is **complete**.
@@ -0,0 +1,76 @@
1
+ # Live Verification — v0.23.0
2
+
3
+ Release date: 2026-07-01. This document records what was exercised against **live
4
+ Google Flow** (credit-free wherever possible) for the user-facing changes in v0.23.0,
5
+ following the 5-layer verification ledger.
6
+
7
+ ## Scope
8
+
9
+ | Change | Surface | Live-verified? |
10
+ |---|---|---|
11
+ | **#228** — MCP generation now functional (tool → FlowWorker → download → record; `tools` applied) | MCP `gflow_generate_image` / `gflow_generate_video` | 🟡 Wiring proven live (tool → worker → real Flow REST + structured-error translation); the final image-write layer was **not** run live (expired session — environmental) — see below |
12
+ | **#230 / #222** — macOS generation 401 fixed (path=/ cookie read + headed-context seed) | `auth/cookies.py`, `api/client.py` (macOS headed Chrome) | ✅ Reporter-verified end-to-end on macOS (Apple Silicon) |
13
+ | **#219** — Chromium-only-host chrome-channel gate + T2I extra-image guard | `browser_manager.py`, image path | ⚠️ Not reproducible on this maintainer box (Google Chrome is installed) — covered by automated tests |
14
+
15
+ ## #228 — MCP generation path (credit-free image)
16
+
17
+ Exercised the **wired MCP tool path in-process** (`gflow_generate_image`, profile
18
+ `denon82`, aspect 1:1, count 1) — the exact path this release fixes (tool → queue →
19
+ `FlowWorker.process_task` → real `FlowApiClient` → real Flow REST).
20
+
21
+ **Proven live (structlog evidence, 2026-07-01):**
22
+ - `mcp.tool.profile_resolved requested=denon82 resolved=denon82` — profile resolution
23
+ - `mcp.tool.task_enqueued task_type=t2i` → `Processing task` — enqueue + worker dispatch
24
+ - `client.persistent_context_launch channel=chrome chrome_strategy_requested=True cookies_db_present=True password_store_basic=True` — real headed Chrome, chrome-strategy
25
+ - `client.context_cookie_state context_cookie_count=57 flow_session_cookie_present=True google_sapisid_present=True` — cookies loaded
26
+ - Reached a **real Flow REST call**: `POST project.createProject`
27
+ - **Structured-error translation confirmed** (the core #228 wiring): the server returned
28
+ HTTP 401 → worker raised `AuthExpiredError` → the MCP tool returned a clean RFC-9457
29
+ failure envelope:
30
+ ```json
31
+ {"status":"failed","error":{"type":".../auth-expired","title":"Authentication expired",
32
+ "status":401,"detail":"HTTP 401","remediation_hint":"Run `gflow auth login ...`",
33
+ "exit_code":3}}
34
+ ```
35
+ This exercises exactly the tool→worker→status-translation path the release wires, plus
36
+ the "any non-`completed` status → failure" behavior added in this release.
37
+
38
+ **Not completed live (environmental, not a code defect):** the actual image creation +
39
+ download + `local_files` recording did not run because the `denon82` Flow session was
40
+ **server-side expired** (HTTP 401 on a fully-loaded cookie jar — a stale session token,
41
+ distinct from the #222 macOS decrypt bug). Completing the image-write layer requires an
42
+ interactive `gflow auth login --profile denon82` (browser login). The generation +
43
+ download + recording code beneath the MCP wiring is the **same shared FlowWorker /
44
+ FlowApiClient path** exercised live in prior releases (CLI image path) and by the
45
+ automated suite.
46
+
47
+ ## #230 / #222 — macOS generation 401
48
+
49
+ Verified **end-to-end on macOS (Apple Silicon) by the issue reporter** (@gunalak), both
50
+ branches of the fix (PR #230 body evidence):
51
+ - **Seed fires** (headed decrypt loaded nothing): `context_cookie_count=0
52
+ flow_session_cookie_present=False` → `preread_count=8 preread_session=True` →
53
+ `context_cookies_seeded seeded_session=True` → `createProject` + `batchGenerateImages`
54
+ **200** → image written.
55
+ - **Native decrypt** (seed is a no-op): `context_cookie_count=7
56
+ flow_session_cookie_present=True` → **200** → image written.
57
+
58
+ Council review (`/gflow:pr-council-review` #230): correctness/security/auth/quality all
59
+ GREEN; tests/memory YELLOW (coverage-gap follow-up tracked).
60
+
61
+ ## Automated coverage
62
+
63
+ - Full suite (this release tree): **1918 passed / 7 skipped** (pre-#230), plus **70
64
+ passed** on the #230-affected suites (`tests/api/test_client_launch_kwargs.py`,
65
+ `tests/auth/`) after the merge.
66
+ - `pyright src`: 0 errors. `ruff check` / `ruff format --check`: clean.
67
+ - New MCP-wiring regression tests (`tests/mcp/test_tools_wired.py`,
68
+ `tests/worker/test_daemon.py`) assert the full enqueue → worker → status-translation
69
+ path and the `tool_specs` application.
70
+
71
+ ## Follow-ups
72
+
73
+ - MCP → worker → download/record has no gated live e2e harness yet (tracked): a
74
+ `test_mcp_*_e2e.py` mirroring `test_daemon_e2e.py` (opt-in, credit-free image).
75
+ - Two #230 regression tests (falsifiable `/fx` cookie-path test + `_preread` capture
76
+ test) tracked as a post-merge follow-up.
@@ -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,10 +45,10 @@ 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)`: Triggers text-to-image (Imagen 3.5 / Nano Banana).
49
- * `gflow_generate_video(prompt, initial_frame_path, aspect, seed)`: Triggers vertical or landscape video generation (Veo 3.1).
50
- * `gflow_list_projects(limit, offset)`: Queries SQLite catalog for recent generation folders.
51
- * `gflow_list_characters(project_id)`: Lists saved project-scoped characters.
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
+ * `gflow_list_projects(profile, limit)`: Queries SQLite catalog for recent generation folders.
51
+ * `gflow_list_characters(profile)`: Lists Flow Character entities (requires an active browser session).
52
52
 
53
53
  ### Prompts (Orchestration templates)
54
54
  * `expand_prompt`: Helps the agent structure simple ideas into Google's official 5-component prompt formula (Subject + Action + Location + Composition + Style) before sending them to the generation tools.
@@ -4,9 +4,38 @@
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
+
20
+ **v0.23.0 — alpha.** **MCP generation goes live + macOS 401 fixed.** The MCP server's
21
+ `gflow_generate_image` / `gflow_generate_video` tools — previously non-functional stubs —
22
+ are now wired end-to-end to the FlowWorker queue (background worker owns download +
23
+ history recording), the `tools` prompt-expansion parameter is actually applied, and i2v/r2v
24
+ require their frame/reference inputs at the tool boundary. The long-standing macOS
25
+ generation `401` (#222) is resolved (#230, @gunalak): Flow cookies are read from the full
26
+ jar by domain instead of a path-`/` filter that dropped the `/fx`-scoped session token, and
27
+ the headed context is seeded from a pre-launch snapshot when macOS can't decrypt the store.
28
+ Carries forward v0.22.0 (Tools framework) + v0.21.0 (MCP server). Verification:
29
+ [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP wiring proven live; #222
30
+ reporter-verified e2e on macOS).
31
+
32
+ </details>
33
+
34
+ <details><summary>v0.22.0 — Tools framework ("Creative Director")</summary>
35
+
7
36
  **v0.22.0 — alpha.** **Tools framework ("Creative Director").** A TOML-defined prompt-tool system: `creative-director` rewrites a terse prompt into a vivid one via Google's five-component formula (public Gemini API, never-fatal), with 15 category-gated domain styles and deterministic banned-keyword stripping. Invoke it via the new `gflow tools list/show/run` group or the uniform `-t`/`--tool` option on every generation command (`image t2i`/`i2i`/`batch`, `video t2v`/`i2v`/`r2v`/`chain`), replacing the never-released `-e/--expand`. History records the original prompt, the submitted `expanded_prompt`, and `metadata_json.tool` provenance (redaction-honoring). **"My Tools"**: user-authored TOMLs in `<GFLOW_CLI_HOME>/tools/*.toml` load automatically. MCP parity via `gflow_list_tools` + a `tools` array param; the legacy `expand_prompt` MCP prompt is deprecated. The Gemini expander gained an overall wall-clock budget. Carries forward v0.21.0 (MCP server over stdio + HTTP/SSE). Verification: [LIVE_VERIFICATION_v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (CI/automated complete; live owner-run pending).
8
37
 
9
- **Develop (unreleased, post-v0.22.0):** *(empty — develop is the staging branch for the next release).*
38
+ </details>
10
39
 
11
40
  ## Milestone history
12
41
 
@@ -68,6 +97,8 @@
68
97
  | Aspect-ratio overrides under Agentic & Classic cohorts + `GFLOW_CLI_PREFER_CLASSIC` (#193) | ✅ done (v0.20.0 / v0.20.1) |
69
98
  | MCP server (`gflow mcp run` stdio + `gflow serve` HTTP/SSE) + daemon/queue scaffolding | ✅ done (v0.21.0) |
70
99
  | Tools framework: `gflow tools` group + `--tool` + `creative-director` + "My Tools" + MCP parity | ✅ done (v0.22.0) |
100
+ | MCP generation wired to FlowWorker (tool→queue→download→record) + `tools` applied + i2v/r2v boundary validation | ✅ done (v0.23.0) |
101
+ | macOS generation 401 fixed — `/fx` cookie-path read + headed-context seed (#222/#230) | ✅ done (v0.23.0) |
71
102
  | `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
72
103
  | Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
73
104
  | Provider abstraction for official Veo 3.1 API | ⏳ planned |
@@ -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