gflow-cli 0.22.0__tar.gz → 0.23.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 (504) hide show
  1. gflow_cli-0.23.0/.claude/commands/gflow/issue-assessment.md +28 -0
  2. gflow_cli-0.23.0/.claude/commands/gflow/issue-resolve.md +18 -0
  3. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/ci.yml +5 -2
  4. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/AGENTS.md +9 -0
  5. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CHANGELOG.md +56 -1
  6. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/GEMINI.md +1 -1
  7. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/KNOWN_ISSUES.md +22 -0
  8. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/PKG-INFO +2 -2
  9. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/PLAN.md +1 -1
  10. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/INDEX.md +1 -2
  11. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.22.0.md +36 -2
  12. gflow_cli-0.23.0/docs/LIVE_VERIFICATION_v0.23.0.md +76 -0
  13. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/MCP.md +4 -4
  14. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/PROJECT_STATUS.md +19 -1
  15. gflow_cli-0.23.0/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +143 -0
  16. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/pyproject.toml +3 -3
  17. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_patchright.py +9 -2
  18. gflow_cli-0.23.0/skills/issue-assessment/SKILL.md +142 -0
  19. gflow_cli-0.23.0/skills/issue-resolve/SKILL.md +123 -0
  20. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/__init__.py +1 -1
  21. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/client.py +224 -4
  22. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/ui_automation.py +10 -9
  23. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/cookies.py +36 -3
  24. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/browser_manager.py +112 -12
  25. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli.py +21 -1
  26. gflow_cli-0.23.0/src/gflow_cli/mcp/tools.py +781 -0
  27. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/worker/daemon.py +132 -34
  28. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_image.py +47 -0
  29. gflow_cli-0.23.0/tests/api/test_client_launch_kwargs.py +310 -0
  30. gflow_cli-0.23.0/tests/auth/test_cookies.py +51 -0
  31. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/dev/test_recording_client.py +1 -0
  32. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/test_server.py +106 -18
  33. gflow_cli-0.23.0/tests/mcp/test_tools_wired.py +440 -0
  34. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_browser_manager.py +89 -0
  35. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/worker/test_daemon.py +108 -19
  36. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/uv.lock +25 -25
  37. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +0 -117
  38. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +0 -110
  39. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +0 -66
  40. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +0 -233
  41. gflow_cli-0.22.0/src/gflow_cli/mcp/tools.py +0 -340
  42. gflow_cli-0.22.0/tests/api/test_client_launch_kwargs.py +0 -77
  43. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/README.md +0 -0
  44. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/active.md +0 -0
  45. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/branch-review.md +0 -0
  46. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/changelog.md +0 -0
  47. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/check.md +0 -0
  48. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/doc-review.md +0 -0
  49. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/known-issues.md +0 -0
  50. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/next.md +0 -0
  51. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/plan.md +0 -0
  52. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  53. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/predict.md +0 -0
  54. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/release.md +0 -0
  55. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/scenario.md +0 -0
  56. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/sonar.md +0 -0
  57. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/status.md +0 -0
  58. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.env.template +0 -0
  59. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.gitattributes +0 -0
  60. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/CODEOWNERS +0 -0
  61. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  62. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/copilot-instructions.md +0 -0
  63. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/dependabot.yml +0 -0
  64. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/external-pr-triage.yml +0 -0
  65. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/governance-advisory.yml +0 -0
  66. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/governance-benchmark.yml +0 -0
  67. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/main-base-guard.yml +0 -0
  68. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/release.yml +0 -0
  69. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.gitignore +0 -0
  70. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.gitleaks.toml +0 -0
  71. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.pre-commit-config.yaml +0 -0
  72. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.secrets.baseline +0 -0
  73. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CLAUDE.md +0 -0
  74. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CONFIGURATION.md +0 -0
  75. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CONTRIBUTING.md +0 -0
  76. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/DISCLAIMER.md +0 -0
  77. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/LICENSE +0 -0
  78. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/README.md +0 -0
  79. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/RELEASE.md +0 -0
  80. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/ROADMAP.md +0 -0
  81. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/conftest.py +0 -0
  82. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docker-compose.yml +0 -0
  83. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AGENT_GUIDE.md +0 -0
  84. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AGENT_UI_E2E.md +0 -0
  85. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AGENT_UI_RECON.md +0 -0
  86. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/ARCHITECTURE.md +0 -0
  87. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AUTHENTICATION.md +0 -0
  88. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/CHARACTER.md +0 -0
  89. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/CHARACTER_RECON.md +0 -0
  90. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/CONFIGURATION.md +0 -0
  91. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DATA_LAYER.md +0 -0
  92. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DEBUGGING.md +0 -0
  93. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DEMOS.md +0 -0
  94. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DEVELOPMENT.md +0 -0
  95. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/E2E_TESTING.md +0 -0
  96. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/EXTERNAL_STORAGE.md +0 -0
  97. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/GITHUB.md +0 -0
  98. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  99. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  100. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  101. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  102. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  103. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  104. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  105. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  106. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  107. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  108. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  109. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  110. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  111. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  112. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  113. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  114. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  115. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  116. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  117. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  118. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/MOVIE.md +0 -0
  119. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/PROMPT_EXPANSION.md +0 -0
  120. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/SECURITY.md +0 -0
  121. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/TOOLS.md +0 -0
  122. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/USAGE.md +0 -0
  123. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/USER_GUIDE.md +0 -0
  124. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/assets/demo-split-pf.gif +0 -0
  125. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/assets/example-run.gif +0 -0
  126. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/assets/examples.webp +0 -0
  127. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/medium_tutorial.md +0 -0
  128. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/schemas/movie-handoff.schema.json +0 -0
  129. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/sonar-cleanup-tracker.md +0 -0
  130. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  131. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  132. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  133. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  134. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  135. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  136. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  137. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  138. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  139. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  140. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  141. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/README.md +0 -0
  142. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/batch_from_config.py +0 -0
  143. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/multi_prompt_t2i.py +0 -0
  144. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/sample_config.json +0 -0
  145. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/sample_prompts.txt +0 -0
  146. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/single_image_t2i.py +0 -0
  147. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/workflow_chain.py +0 -0
  148. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/llms.txt +0 -0
  149. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/README.md +0 -0
  150. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/01_upload_image.json +0 -0
  151. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  152. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  153. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/04_archive_workflow.json +0 -0
  154. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/05_createProject.json +0 -0
  155. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/06_batchGenerateImages.json +0 -0
  156. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  157. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  158. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  159. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  160. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  161. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/12_create_scene.json +0 -0
  162. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  163. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/14_get_scene_workflows.json +0 -0
  164. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  165. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/ci/check_doc_links.py +0 -0
  166. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/ci/check_materiality.py +0 -0
  167. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/ci/check_repo_hygiene.py +0 -0
  168. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/debug_editor.py +0 -0
  169. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/debug_gen_settings.py +0 -0
  170. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/debug_settings.py +0 -0
  171. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/_recording_client.py +0 -0
  172. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/_spike_common.py +0 -0
  173. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/active_plan.py +0 -0
  174. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  175. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  176. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  177. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  178. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  179. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  180. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_locale_invariants.py +0 -0
  181. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  182. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/character_create_spike.py +0 -0
  183. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/character_create_spike_v2.py +0 -0
  184. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/dump_character_selectors.js +0 -0
  185. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/make_project.py +0 -0
  186. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/materiality_backtest.py +0 -0
  187. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/monitor_pr_38.py +0 -0
  188. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/patch_character.py +0 -0
  189. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/skillopt/README.md +0 -0
  190. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/skillopt/harness.py +0 -0
  191. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/skillopt/tasks.json +0 -0
  192. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  193. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  194. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  195. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  196. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  197. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  198. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  199. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  200. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  201. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  202. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  203. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  204. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  205. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_patch_entity.py +0 -0
  206. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/README.md +0 -0
  207. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/capture_flow_traffic.py +0 -0
  208. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/memory_profile.py +0 -0
  209. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/recaptcha_mint.py +0 -0
  210. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  211. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  212. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/record_demo.ps1 +0 -0
  213. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_image.py +0 -0
  214. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_real_chrome_image.py +0 -0
  215. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_video_editor.py +0 -0
  216. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_worker_style.py +0 -0
  217. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/verify_chrome_auth_viability.py +0 -0
  218. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/README.md +0 -0
  219. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/gflow-cli/SKILL.md +0 -0
  220. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/plan/SKILL.md +0 -0
  221. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/pr-council-review/SKILL.md +0 -0
  222. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/predict/SKILL.md +0 -0
  223. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/scenario/SKILL.md +0 -0
  224. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/status/SKILL.md +0 -0
  225. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/sonar-project.properties +0 -0
  226. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/__main__.py +0 -0
  227. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/_cli_helpers.py +0 -0
  228. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/__init__.py +0 -0
  229. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/_engine.py +0 -0
  230. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/_retry.py +0 -0
  231. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  232. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/character.py +0 -0
  233. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/dto.py +0 -0
  234. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/image.py +0 -0
  235. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/image_upscale.py +0 -0
  236. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/recaptcha.py +0 -0
  237. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/routes.py +0 -0
  238. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/scene.py +0 -0
  239. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  240. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/_common.py +0 -0
  241. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  242. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/base.py +0 -0
  243. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  244. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  245. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  246. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  247. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  248. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  249. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  250. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  251. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  252. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  253. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/video.py +0 -0
  254. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/__init__.py +0 -0
  255. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/base.py +0 -0
  256. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/factory.py +0 -0
  257. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  258. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  259. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/strategies.py +0 -0
  260. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/verification.py +0 -0
  261. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/chain.py +0 -0
  262. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/chain_manifest.py +0 -0
  263. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_character.py +0 -0
  264. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_data.py +0 -0
  265. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_image.py +0 -0
  266. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_models.py +0 -0
  267. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_movie.py +0 -0
  268. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_run.py +0 -0
  269. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_scene.py +0 -0
  270. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_tools.py +0 -0
  271. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_video.py +0 -0
  272. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/composition.py +0 -0
  273. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/config.py +0 -0
  274. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/__init__.py +0 -0
  275. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/chain_repo.py +0 -0
  276. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  277. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  278. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  279. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  280. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  281. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  282. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  283. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  284. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  285. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/models.py +0 -0
  286. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/queries.py +0 -0
  287. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/recorder.py +0 -0
  288. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/redaction.py +0 -0
  289. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/repository.py +0 -0
  290. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/store.py +0 -0
  291. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/errors.py +0 -0
  292. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/exceptions.py +0 -0
  293. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/image_batch.py +0 -0
  294. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/json_output.py +0 -0
  295. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/manifest.py +0 -0
  296. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/__init__.py +0 -0
  297. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/prompts.py +0 -0
  298. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/resources.py +0 -0
  299. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/server.py +0 -0
  300. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/media.py +0 -0
  301. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/movie_manifest.py +0 -0
  302. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/observability.py +0 -0
  303. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/paths.py +0 -0
  304. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/profile_store.py +0 -0
  305. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/services/__init__.py +0 -0
  306. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/services/character_create.py +0 -0
  307. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/storage.py +0 -0
  308. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/__init__.py +0 -0
  309. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/banned.py +0 -0
  310. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  311. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  312. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/expander.py +0 -0
  313. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/invocation.py +0 -0
  314. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/loader.py +0 -0
  315. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/registry.py +0 -0
  316. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/runtime.py +0 -0
  317. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/spec.py +0 -0
  318. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/ui/app.py +0 -0
  319. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/ui/server.py +0 -0
  320. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/worker/queue.py +0 -0
  321. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tasks/lessons.md +0 -0
  322. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/test_assets/sample_batch.json +0 -0
  323. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/test_assets/sample_batch.tsv +0 -0
  324. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/test_assets/sample_batch_invalid.tsv +0 -0
  325. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/__init__.py +0 -0
  326. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/__init__.py +0 -0
  327. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/fixtures/character_gen_response.json +0 -0
  328. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  329. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  330. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  331. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_bearer_redaction.py +0 -0
  332. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_character.py +0 -0
  333. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client.py +0 -0
  334. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_character.py +0 -0
  335. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_delete_characters.py +0 -0
  336. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_generate_character.py +0 -0
  337. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_patch_entity.py +0 -0
  338. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_scene.py +0 -0
  339. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_upscale.py +0 -0
  340. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_concurrency.py +0 -0
  341. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_dto.py +0 -0
  342. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_engine.py +0 -0
  343. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_image.py +0 -0
  344. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_image_dto.py +0 -0
  345. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_image_upscale.py +0 -0
  346. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  347. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_recaptcha.py +0 -0
  348. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_retry.py +0 -0
  349. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_routes.py +0 -0
  350. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_routes_character.py +0 -0
  351. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_routes_scene.py +0 -0
  352. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_sapisidhash_helper.py +0 -0
  353. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_scene_models.py +0 -0
  354. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_video.py +0 -0
  355. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_video_request.py +0 -0
  356. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/__init__.py +0 -0
  357. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/conftest.py +0 -0
  358. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/drivers/__init__.py +0 -0
  359. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  360. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/drivers/test_factory.py +0 -0
  361. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_base.py +0 -0
  362. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_bearer.py +0 -0
  363. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_common.py +0 -0
  364. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  365. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_factory.py +0 -0
  366. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_fingerprint.py +0 -0
  367. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_sapisidhash.py +0 -0
  368. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_transport_timeout.py +0 -0
  369. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation.py +0 -0
  370. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  371. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  372. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  373. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  374. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/auth/strategies/test_factory.py +0 -0
  375. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/auth/strategies/test_strategies.py +0 -0
  376. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/auth/test_verification.py +0 -0
  377. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/__init__.py +0 -0
  378. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_auth_list.py +0 -0
  379. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_character.py +0 -0
  380. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_character_create.py +0 -0
  381. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_data.py +0 -0
  382. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image.py +0 -0
  383. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  384. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  385. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image_upscale.py +0 -0
  386. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_models.py +0 -0
  387. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_movie.py +0 -0
  388. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_run.py +0 -0
  389. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_scene.py +0 -0
  390. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_tools.py +0 -0
  391. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_video.py +0 -0
  392. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_video_chain.py +0 -0
  393. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_error_handling.py +0 -0
  394. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_helpers.py +0 -0
  395. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_movie_manifest.py +0 -0
  396. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_settings_validation.py +0 -0
  397. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  398. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/composition/test_character.py +0 -0
  399. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/composition/test_compose_prompt.py +0 -0
  400. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/composition/test_handoff.py +0 -0
  401. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/conftest.py +0 -0
  402. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/__init__.py +0 -0
  403. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_chain_repo.py +0 -0
  404. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_find_incomplete_character.py +0 -0
  405. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_models.py +0 -0
  406. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_packaging.py +0 -0
  407. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_recorder.py +0 -0
  408. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_recorder_character.py +0 -0
  409. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_redaction.py +0 -0
  410. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_repository.py +0 -0
  411. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_scene_persistence.py +0 -0
  412. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_settings_and_errors.py +0 -0
  413. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_store_migrations.py +0 -0
  414. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/__init__.py +0 -0
  415. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/conftest.py +0 -0
  416. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  417. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  418. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_chain_e2e.py +0 -0
  419. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_character_create_e2e.py +0 -0
  420. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_daemon_e2e.py +0 -0
  421. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  422. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  423. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  424. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  425. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_json_output_e2e.py +0 -0
  426. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  427. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_scene_compose_live.py +0 -0
  428. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_tools_e2e.py +0 -0
  429. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_transports_e2e.py +0 -0
  430. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  431. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  432. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/__init__.py +0 -0
  433. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/auth.feature +0 -0
  434. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/auth_login.feature +0 -0
  435. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/character_create.feature +0 -0
  436. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/character_read.feature +0 -0
  437. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/conftest.py +0 -0
  438. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/image.feature +0 -0
  439. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/image_upscale.feature +0 -0
  440. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/locale_picker_include.feature +0 -0
  441. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_auth_login_steps.py +0 -0
  442. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_auth_steps.py +0 -0
  443. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_character_create_steps.py +0 -0
  444. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_character_read_steps.py +0 -0
  445. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_image_steps.py +0 -0
  446. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_image_upscale_steps.py +0 -0
  447. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  448. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_step_collision_guard.py +0 -0
  449. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  450. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_video_chain_steps.py +0 -0
  451. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/video_agent_ui.feature +0 -0
  452. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/video_chain.feature +0 -0
  453. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/fixtures/__init__.py +0 -0
  454. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/fixtures/seeded_catalog.py +0 -0
  455. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/image_batch/__init__.py +0 -0
  456. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/image_batch/test_image_manifest.py +0 -0
  457. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/image_batch/test_observability_events.py +0 -0
  458. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/__init__.py +0 -0
  459. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/conftest.py +0 -0
  460. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/constants.py +0 -0
  461. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/test_storage_gcs.py +0 -0
  462. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/test_storage_s3.py +0 -0
  463. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/__init__.py +0 -0
  464. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/conftest.py +0 -0
  465. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/test_stdio_transport.py +0 -0
  466. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  467. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  468. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_check_materiality.py +0 -0
  469. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  470. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_materiality_backtest.py +0 -0
  471. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/__init__.py +0 -0
  472. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/test_character_create_redaction.py +0 -0
  473. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/test_character_create_saga.py +0 -0
  474. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  475. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/smoke/__init__.py +0 -0
  476. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  477. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/smoke/test_real_flow.py +0 -0
  478. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_auth.py +0 -0
  479. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_chain.py +0 -0
  480. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_chain_manifest.py +0 -0
  481. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_cli_data.py +0 -0
  482. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_config.py +0 -0
  483. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_conftest_isolation.py +0 -0
  484. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_data_queries.py +0 -0
  485. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_documentation_gate.py +0 -0
  486. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_errors.py +0 -0
  487. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_errors_403.py +0 -0
  488. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_json_output.py +0 -0
  489. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_manifest.py +0 -0
  490. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_marker_registry.py +0 -0
  491. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_media.py +0 -0
  492. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_observability.py +0 -0
  493. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_paths.py +0 -0
  494. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_profile_store.py +0 -0
  495. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_smoke.py +0 -0
  496. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/__init__.py +0 -0
  497. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_banned.py +0 -0
  498. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_expander.py +0 -0
  499. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_invocation.py +0 -0
  500. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_loader.py +0 -0
  501. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_registry.py +0 -0
  502. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_runtime.py +0 -0
  503. {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_spec.py +0 -0
  504. {gflow_cli-0.22.0 → gflow_cli-0.23.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,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.23.0] — 2026-07-01
11
+
12
+ ### Added
13
+
14
+ - **MCP generation is now functional (#228)**: the `gflow_generate_image` and
15
+ `gflow_generate_video` MCP tools — previously non-functional stubs — now enqueue onto
16
+ the FlowWorker queue and run end-to-end, with the background worker owning download and
17
+ history recording. The `tools` parameter (e.g. `creative-director`) is now applied to
18
+ expand the prompt before generation (it was previously accepted but never applied), and
19
+ reference images are supported across the image (`i2i`) and video (`i2v` / `r2v`) tools.
20
+
21
+ ### Fixed
22
+
23
+ - **macOS generation 401 — resolved (#222, #230)**: Flow cookies are now read from the
24
+ full cookie jar filtered by domain instead of a path-`/` URL filter that silently
25
+ dropped the `/fx`-scoped `__Secure-next-auth.session-token`; and on macOS — where the
26
+ headed generation context can intermittently fail to decrypt the on-disk cookie store —
27
+ the session is seeded into the context from a snapshot captured pre-launch via the
28
+ working `--password-store=basic` reader. Verified end-to-end on macOS (Apple Silicon) by
29
+ the reporter. Thanks @gunalak.
30
+ - **MCP video task safety (#228)**: `i2v` now requires `initial_frame` and `r2v` requires
31
+ `reference_images`, validated at the tool boundary with a clear error; a post-success
32
+ recording failure no longer flips a credit-spent video to `failed`; and any
33
+ non-`completed` task status is reported as a failure rather than a false success.
34
+ - **Chrome channel on Chromium-only hosts**: `channel_for_profile()` now gates
35
+ Playwright's `channel="chrome"` on a new `_is_playwright_chrome_channel_available()`
36
+ check that probes only the exact Google-Chrome paths Playwright hardcodes, instead
37
+ of `is_chrome_available()` (which also accepts Chromium). On a host with only
38
+ Chromium installed, the CLI no longer requests `channel="chrome"` and fails with
39
+ `Chromium distribution 'chrome' is not found at /opt/google/chrome/chrome`; it falls
40
+ back to bundled Chromium and logs an actionable warning (#219).
41
+ - **Text-to-image extra-image billing**: the generation-settings trigger selector now
42
+ requires `button[aria-haspopup='menu']` (aliased to `MODE_SWITCH_TRIGGER_SELECTORS`),
43
+ preventing a mis-click on an icon-only aspect thumbnail that skipped the count panel
44
+ and left Flow's own default count (typically 2) in effect — billing extra generations
45
+ while the CLI saved only one (#219).
46
+ - **Extra-image observability**: `generate_image()` now logs a
47
+ `client.generate_image_extra_returned` warning when the transport returns more images
48
+ than the requested `count=1`, so silent over-generation is surfaced to the user (#219).
49
+ - **macOS generation 401 — fail loud (#222)**: a `chrome`-strategy profile that is
50
+ silently downgraded to bundled Chromium at generation launch now raises instead of
51
+ running logged-out, so the macOS auth failure surfaces at its cause rather than as an
52
+ opaque later `401`.
53
+
54
+ ### Diagnostics
55
+
56
+ - **Persistent-context cookie state (#222)**: generation launch now logs the resolved
57
+ `cookies_db_path` (`client.persistent_context_launch`) and the launched context's own
58
+ cookie state (`client.context_cookie_state`: `flow_session_cookie_present` / count /
59
+ expiry — **never values**, safe to paste publicly). This splits a cookie-**load**
60
+ failure (the macOS persistent context cannot decrypt the profile's cookies) from a
61
+ server-side rejection — the observability that localized the macOS `401` root cause,
62
+ now resolved (see the #222/#230 entry above).
63
+
10
64
  ## [0.22.0] — 2026-06-28
11
65
 
12
66
  ### Added
@@ -1628,7 +1682,8 @@ shell-script template that branches on these codes.
1628
1682
 
1629
1683
  First skeleton. Not functional end-to-end yet.
1630
1684
 
1631
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...HEAD
1685
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.23.0...HEAD
1686
+ [0.23.0]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...v0.23.0
1632
1687
  [0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
1633
1688
  [0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
1634
1689
  [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.23.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.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.
@@ -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)`: 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`.
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,25 @@
4
4
 
5
5
  ## Current release
6
6
 
7
+ **v0.23.0 — alpha.** **MCP generation goes live + macOS 401 fixed.** The MCP server's
8
+ `gflow_generate_image` / `gflow_generate_video` tools — previously non-functional stubs —
9
+ are now wired end-to-end to the FlowWorker queue (background worker owns download +
10
+ history recording), the `tools` prompt-expansion parameter is actually applied, and i2v/r2v
11
+ require their frame/reference inputs at the tool boundary. The long-standing macOS
12
+ generation `401` (#222) is resolved (#230, @gunalak): Flow cookies are read from the full
13
+ jar by domain instead of a path-`/` filter that dropped the `/fx`-scoped session token, and
14
+ the headed context is seeded from a pre-launch snapshot when macOS can't decrypt the store.
15
+ Carries forward v0.22.0 (Tools framework) + v0.21.0 (MCP server). Verification:
16
+ [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP wiring proven live; #222
17
+ reporter-verified e2e on macOS).
18
+
19
+ **Develop (unreleased, post-v0.23.0):** *(empty — develop is the staging branch for the next release).*
20
+
21
+ <details><summary>v0.22.0 — Tools framework ("Creative Director")</summary>
22
+
7
23
  **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
24
 
9
- **Develop (unreleased, post-v0.22.0):** *(empty — develop is the staging branch for the next release).*
25
+ </details>
10
26
 
11
27
  ## Milestone history
12
28
 
@@ -68,6 +84,8 @@
68
84
  | Aspect-ratio overrides under Agentic & Classic cohorts + `GFLOW_CLI_PREFER_CLASSIC` (#193) | ✅ done (v0.20.0 / v0.20.1) |
69
85
  | MCP server (`gflow mcp run` stdio + `gflow serve` HTTP/SSE) + daemon/queue scaffolding | ✅ done (v0.21.0) |
70
86
  | Tools framework: `gflow tools` group + `--tool` + `creative-director` + "My Tools" + MCP parity | ✅ done (v0.22.0) |
87
+ | MCP generation wired to FlowWorker (tool→queue→download→record) + `tools` applied + i2v/r2v boundary validation | ✅ done (v0.23.0) |
88
+ | macOS generation 401 fixed — `/fx` cookie-path read + headed-context seed (#222/#230) | ✅ done (v0.23.0) |
71
89
  | `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
72
90
  | Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
73
91
  | Provider abstraction for official Veo 3.1 API | ⏳ planned |
@@ -0,0 +1,143 @@
1
+ # Issue-assessment workflow — design
2
+
3
+ > Status: **approved design** (2026-06-29). Next step: `writing-plans` → author skills with `writing-skills`.
4
+ > Scope: two new project skills that let an agent triage a GitHub issue, report to the reporter, and — when scope is clear — drive a guard-railed fix to a draft PR. Built to run both interactively and autonomously (hermes-ops on the VPS).
5
+
6
+ ## Problem
7
+
8
+ Incoming GitHub issues (e.g. #222) need a **systematic, repeatable** assessment instead of ad-hoc investigation. We want a process that:
9
+
10
+ 1. Reads the reporter's claim and verifies it against code, tests, docs, `KNOWN_ISSUES.md`, and auto-memory.
11
+ 2. Produces a defensible verdict and a reply to the reporter.
12
+ 3. **Requires e2e evidence before claiming a fix works** — and is honest when e2e is impossible in the current environment.
13
+ 4. When scope is clear, performs the full development workflow in an isolated worktree and opens a PR **for human review** (never merges).
14
+ 5. Can run **autonomously** (hermes-ops VPS) without taking wrong outward-facing actions.
15
+ 6. Tells the agent **which project skill to use for what**, so it does not hallucinate skill names.
16
+
17
+ ## Key environmental constraint
18
+
19
+ The hermes-ops VPS is **headless Linux**. Flow generation auth requires a **headed real-Chrome** session (`real-browser-auth-mandatory` in memory). Therefore, for any Flow-generation/selector/auth bug, the autonomous agent **cannot e2e-verify** — it can only get the problem review-ready and hand to a human. This is encoded as a **standing known limitation**, never hidden. The design goal is to make a wrong autonomous action *rare*, not to pretend the agent can verify everything.
20
+
21
+ ## Two-layer architecture (orchestration vs domain)
22
+
23
+ Separation of concerns across two repos, with a one-way dependency:
24
+
25
+ - **hermes-ops = orchestration layer (project-agnostic "HOW the agent operates").** Triggers (cron/webhook/label), the autonomy gate, the `skills/`→`blessed/` blessing procedure, secret access (SOPS `GH_TOKEN`), the Opus→Sonnet→Opus delegation loop, Telegram delivery, idempotency. Hosts an `autopilot-core` reused by `dependabot-autopilot` (deterministic), `issue-autopilot` (LLM), and `release-autopilot` (weekly patch-bump-if-safe).
26
+ - **gflow-cli = domain layer (project-specific "WHAT the work means").** `issue-assessment` / `issue-resolve` + the existing `/gflow:*` pipeline. Encodes gflow-cli's e2e-gate (headed-browser truth), `KNOWN_ISSUES`, branch workflow.
27
+
28
+ **Rule:** hermes orchestration *calls into* a target repo's domain skills; gflow-cli never imports hermes. A gflow-cli skill must run standalone (interactive) **and** be invokable by hermes. The safety boundary lands on the blessing gate — the autonomous machinery (hermes layer) is exactly what a human blesses; domain skills are ordinary repo content. The two skills below are the **domain layer**; the orchestration layer is a later phase in the hermes-ops repo.
29
+
30
+ ## Architecture — two skills (domain layer)
31
+
32
+ The repo already ships the fix pipeline as skills (`/gflow:predict` → `/gflow:scenario` → `/gflow:plan` → `/gflow:check` → `/gflow:pr-council-review`) plus superpowers TDD/worktrees. The new work is a **conductor** on top, split for a clean safety boundary:
33
+
34
+ - **`issue-assessment`** — READ-ONLY. Always safe to run, VPS-friendly. Ingest → verify → classify → e2e-gate → report. Decides (graded, not a hard stop) whether to chain into `issue-resolve`.
35
+ - **`issue-resolve`** — MUTATING, gated, autonomous-with-guardrails. Worktree off `develop` → predict/scenario/plan → TDD with Opus-orchestrated review loop → check → browser-free verification → **draft** PR → council review → STOP.
36
+
37
+ ```
38
+ GitHub issue ─► issue-assessment (read-only)
39
+ 1. Ingest gh issue view → claim, env, repro
40
+ 2. Verify Explore agent over code/tests/docs + KNOWN_ISSUES.md + memory
41
+ 3. Classify verdict taxonomy
42
+ 4. e2e-gate is verification possible here & now?
43
+ 5. Report comment to reporter (verdict + next step)
44
+ ├─ INVALID / DUP / WONTFIX / NEEDS-INFO ─► stop (comment only)
45
+ └─ CONFIRMED/LIKELY-BUG & scope clear ──► issue-resolve (if autonomy gate allows)
46
+
47
+ issue-resolve (mutating, gated)
48
+ worktree off develop → /gflow:predict → /gflow:scenario → /gflow:plan
49
+ → TDD (Opus plans, Sonnet codes, Opus reviews, loop to consensus)
50
+ → /gflow:check → browser-free verification only
51
+ → DRAFT PR → /gflow:pr-council-review → STOP
52
+ Human: promote draft → headed e2e → merge.
53
+ ```
54
+
55
+ ## `issue-assessment` detail
56
+
57
+ ### Verdict taxonomy (exactly one per assessment)
58
+
59
+ - `CONFIRMED-BUG` — reproduced or root-caused in code with line-level evidence.
60
+ - `LIKELY-BUG / NEEDS-E2E` — strong code hypothesis, unverifiable here (e.g. #222: macOS-only, no headed browser). **The common VPS outcome.**
61
+ - `NEEDS-INFO` — reporter must supply a discriminating diagnostic first.
62
+ - `DUPLICATE` / `KNOWN-ISSUE` — matches `KNOWN_ISSUES.md` or an open issue/PR.
63
+ - `WORKING-AS-INTENDED` / `INVALID` — usage error or expected behavior.
64
+ - `WONTFIX / OUT-OF-SCOPE` — real but deliberately not addressed.
65
+
66
+ ### e2e-gate (the honesty mechanism)
67
+
68
+ Before claiming any verification, classify what verification *requires*:
69
+
70
+ - **Browser-free** (Gemini tool-path, unit, lint, pyright, recording-verif) → runnable autonomously; run it.
71
+ - **Headed-Flow-browser required** (generation, selector, auth) → NOT possible on VPS → mark `NEEDS-E2E`, never claim success, hand to human.
72
+
73
+ ### Report format
74
+
75
+ A reporter-facing comment: restated claim, verdict + confidence, evidence (`file:line`), root-cause hypothesis, the discriminating diagnostic requested (if `NEEDS-INFO`/`NEEDS-E2E`), and the next step (draft PR link if `issue-resolve` ran, else what we need).
76
+
77
+ ## `issue-resolve` guardrails
78
+
79
+ Autonomous allow-list:
80
+ - ✅ Post issue comment (text reply to reporter).
81
+ - ✅ Open a **draft** PR (push branch + open PR in draft state).
82
+ - ✅ Browser-free / credit-free verification.
83
+ - ❌ **Never** spend Veo credits (no credit-spending e2e).
84
+ - ❌ Never mark a PR ready; ❌ never merge; ❌ never push to `main`/`develop` (always a `bugfix/`-prefixed branch off `develop`).
85
+
86
+ Hard preconditions before opening even a draft PR:
87
+ 1. Verdict ∈ {`CONFIRMED-BUG`, `LIKELY-BUG`} **and** scope single-surface / localized.
88
+ 2. A failing test exists first (TDD) and passes after the fix.
89
+ 3. `/gflow:check` clean (ruff + pyright + tests).
90
+ 4. If verification needed a headed browser → PR body states **"NOT e2e-verified — requires human macOS/headed run"** explicitly.
91
+
92
+ Trigger gate (autonomy safety): the agent acts **only on issues a human labels** (e.g. `triage`), never on every new issue.
93
+
94
+ ### Orchestration model
95
+
96
+ Opus plans → delegates coding to Sonnet → Opus reviews → loop until consensus → `/gflow:pr-council-review`. Gemini (`agy`) as an optional extra reviewer **if available** — soft dependency, never blocks.
97
+
98
+ ## Anti-hallucination skill routing
99
+
100
+ The skill ships a **literal routing table** mapping situation → skill → how to invoke. Critical trap (in memory `skill-wrapper-registration-trap`): this repo's `skills/*/SKILL.md` are plain markdown invoked by **reading** `.claude/commands/gflow/*`, NOT by `Skill()`. Superpowers skills ARE `Skill()`-invocable. The skill instructs the agent to **re-derive** the table from `ls skills/` + `ls .claude/commands/gflow/` rather than trust a possibly-stale list.
101
+
102
+ | Situation | Use | How |
103
+ |---|---|---|
104
+ | High-stakes change (auth/transport/selector/schema) | `/gflow:predict` | Read `skills/predict/SKILL.md` |
105
+ | Edge cases + BDD skeleton | `/gflow:scenario` | Read `skills/scenario/SKILL.md` |
106
+ | Write task checklist | `/gflow:plan` | Read `skills/plan/SKILL.md` |
107
+ | Before any commit | `/gflow:check` | `.claude/commands/gflow/check.md` |
108
+ | Pre-PR / PR review | `/gflow:pr-council-review`, `branch-review` | Read `skills/pr-council-review/SKILL.md` |
109
+ | Touching auth/reCAPTCHA | `/gflow:known-issues` | `.claude/commands/gflow/known-issues.md` |
110
+ | Worktree, TDD, finishing a branch | superpowers | `Skill()` tool (these are invocable) |
111
+
112
+ ## File layout
113
+
114
+ ```
115
+ skills/issue-assessment/SKILL.md # read-only conductor
116
+ skills/issue-resolve/SKILL.md # mutating, gated
117
+ .claude/commands/gflow/issue-assessment.md # thin wrapper: "read skills/.../SKILL.md"
118
+ .claude/commands/gflow/issue-resolve.md
119
+ ```
120
+
121
+ ## Worked example — issue #222 (validation case)
122
+
123
+ macOS, v0.22.0: `image t2i` launches a logged-out browser → 401 on `createProject` despite `.gflow_browser_strategy=chrome`. Code investigation hypothesis: `channel_for_profile()` returns `None` because macOS `is_chrome_available()` (`src/gflow_cli/browser_manager.py:146`) only checks the hardcoded `/Applications/Google Chrome.app/...` path with no `shutil.which()` fallback (unlike Windows/Linux), so generation falls back to bundled Chromium, which can't decrypt Keychain-protected cookies. **Caveat:** if detection failed, a `browser_manager.chrome_marker_but_unavailable` warning should fire — the reporter didn't mention it, so the channel may instead never be resolved on the `setup_shared_page` path. This ambiguity is exactly why the verdict is `LIKELY-BUG / NEEDS-E2E` (macOS + headed browser, unverifiable on Windows or the VPS) rather than `CONFIRMED-BUG`. Expected workflow output: a reporter reply requesting the discriminating diagnostic (does the warning appear? actual Chrome path? DEBUG run with channel logging), plus optionally a draft PR adding the `shutil.which` fallback with a unit test, flagged NOT-e2e-verified.
124
+
125
+ ## hermes-ops orchestration layer (later phase, hermes-ops repo)
126
+
127
+ Confirmed facts about the target runtime (`C:\development\github\hermes-ops`, deployed):
128
+
129
+ - **VPS:** `89.167.1.15` (`cgserver01`), headless Hetzner Linux. SSH `deploy@89.167.1.15` (key-based). hermes-agent v0.16.0 as a systemd unit (`HERMES_HOME=/opt/hermes`); repo at `/opt/hermes-ops` (git-pull deploy: `git fetch && git reset --hard origin/main`).
130
+ - **GitHub creds:** `GH_TOKEN` already provisioned in SOPS (`secrets/vps-prod.env.sops.yaml`), fine-grained PAT scoped to **gflow-cli `pull_requests:write + contents:write`**. Decrypted by `hermes.service` `ExecStartPre` to `/opt/hermes/.env` (600, owner `hermes`); `gh` reads it automatically.
131
+ - **Knowledge (T1):** git-versioned markdown in `hermes-ops/knowledge/`; update = branch → human review → merge → VPS pulls.
132
+ - **Triggers:** `hermes cron create "<expr>" "<prompt>" --skills … --deliver telegram` (v1); `hermes webhook subscribe --events … --skills … --deliver …` (v2, deferred).
133
+ - **Blessing gate (NOT yet implemented):** `skills/` (unprivileged staging) → human signoff → `blessed/` (executable). Skill file format + promotion procedure are undefined on disk — `autopilot-core` defines them once.
134
+ - **Headless confirmation:** no headed Chrome on the VPS → Flow-generation/selector/auth bugs are **never** e2e-verifiable autonomously. This is the standing known limitation that forces the `LIKELY-BUG / NEEDS-E2E` + draft-PR-for-human terminal behavior.
135
+
136
+ Reconciliation: the same-day `hermes-ops/docs/specs/2026-06-29-dependabot-autopilot-design.md` becomes the first (deterministic) specialization of `autopilot-core`. Nothing runs on the remote until the user confirms; this section is reference for the orchestration-layer spec to be written in the hermes-ops repo.
137
+
138
+ ## Out of scope (this spec — domain layer only)
139
+
140
+ - The hermes-ops orchestration layer (`autopilot-core`, `issue-autopilot`, `release-autopilot`) — designed separately in the hermes-ops repo.
141
+ - Auto-merging or auto-promoting PRs (always draft, human promotes).
142
+ - Acting on unlabeled issues.
143
+ - Onboarding target repos other than gflow-cli.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gflow-cli"
3
- version = "0.22.0"
3
+ version = "0.23.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" }
@@ -39,7 +39,7 @@ dependencies = [
39
39
  dev = [
40
40
  "pytest>=8.0.0",
41
41
  "pytest-asyncio>=0.23.0",
42
- "ruff==0.15.18",
42
+ "ruff==0.15.20",
43
43
  "pyright>=1.1.0",
44
44
  # video-chain: the last-frame extractor (media.py) decodes with PyAV, and its
45
45
  # tests build synthetic mp4 fixtures with numpy. Declared here so the dev/CI
@@ -149,7 +149,7 @@ dev = [
149
149
  "pytest-asyncio>=1.3.0",
150
150
  "pytest-bdd>=8.1.0",
151
151
  "pytest-cov>=7.1.0",
152
- "ruff==0.15.18",
152
+ "ruff==0.15.20",
153
153
  ]
154
154
  # Container-based integration tests — requires Docker daemon.
155
155
  # Install: uv sync --group containers