gflow-cli 0.21.0__tar.gz → 0.22.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 (495) hide show
  1. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/pr-council-review.md +6 -0
  2. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/release.md +4 -2
  3. gflow_cli-0.22.0/.claude/commands/gflow/sonar.md +82 -0
  4. gflow_cli-0.22.0/.github/workflows/main-base-guard.yml +50 -0
  5. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.gitignore +12 -6
  6. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/AGENTS.md +1 -0
  7. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/CHANGELOG.md +48 -1
  8. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/CONFIGURATION.md +2 -0
  9. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/CONTRIBUTING.md +17 -0
  10. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/PKG-INFO +2 -1
  11. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/PLAN.md +7 -1
  12. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/README.md +1 -0
  13. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/CONFIGURATION.md +25 -2
  14. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/INDEX.md +6 -1
  15. gflow_cli-0.22.0/docs/LIVE_VERIFICATION_v0.22.0.md +86 -0
  16. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/PROJECT_STATUS.md +7 -2
  17. gflow_cli-0.22.0/docs/PROMPT_EXPANSION.md +247 -0
  18. gflow_cli-0.22.0/docs/TOOLS.md +301 -0
  19. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/USAGE.md +65 -1
  20. gflow_cli-0.22.0/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +141 -0
  21. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/pyproject.toml +1 -1
  22. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/__init__.py +1 -1
  23. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/_cli_helpers.py +104 -1
  24. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/image.py +8 -0
  25. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/video.py +7 -0
  26. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/chain.py +7 -0
  27. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli.py +2 -0
  28. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_image.py +64 -3
  29. gflow_cli-0.22.0/src/gflow_cli/cli_tools.py +88 -0
  30. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_video.py +88 -6
  31. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/config.py +13 -1
  32. gflow_cli-0.22.0/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +6 -0
  33. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/models.py +3 -0
  34. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/recorder.py +79 -4
  35. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/repository.py +5 -3
  36. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/image_batch.py +13 -1
  37. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/mcp/prompts.py +12 -1
  38. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/mcp/tools.py +77 -0
  39. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/paths.py +5 -0
  40. gflow_cli-0.22.0/src/gflow_cli/tools/banned.py +81 -0
  41. gflow_cli-0.22.0/src/gflow_cli/tools/builtin/creative-director.toml +229 -0
  42. gflow_cli-0.22.0/src/gflow_cli/tools/expander.py +303 -0
  43. gflow_cli-0.22.0/src/gflow_cli/tools/invocation.py +87 -0
  44. gflow_cli-0.22.0/src/gflow_cli/tools/loader.py +64 -0
  45. gflow_cli-0.22.0/src/gflow_cli/tools/registry.py +52 -0
  46. gflow_cli-0.22.0/src/gflow_cli/tools/runtime.py +63 -0
  47. gflow_cli-0.22.0/src/gflow_cli/tools/spec.py +78 -0
  48. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_image.py +51 -0
  49. gflow_cli-0.22.0/tests/cli/test_cli_tools.py +46 -0
  50. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_video.py +114 -0
  51. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_helpers.py +147 -0
  52. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_t2i_multi_prompt.py +47 -0
  53. gflow_cli-0.22.0/tests/data/test_recorder.py +488 -0
  54. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_store_migrations.py +1 -0
  55. gflow_cli-0.22.0/tests/e2e/test_tools_e2e.py +201 -0
  56. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/mcp/test_server.py +76 -3
  57. gflow_cli-0.22.0/tests/services/__init__.py +0 -0
  58. gflow_cli-0.22.0/tests/smoke/__init__.py +0 -0
  59. gflow_cli-0.22.0/tests/tools/__init__.py +0 -0
  60. gflow_cli-0.22.0/tests/tools/test_banned.py +58 -0
  61. gflow_cli-0.22.0/tests/tools/test_expander.py +295 -0
  62. gflow_cli-0.22.0/tests/tools/test_invocation.py +88 -0
  63. gflow_cli-0.22.0/tests/tools/test_loader.py +52 -0
  64. gflow_cli-0.22.0/tests/tools/test_registry.py +77 -0
  65. gflow_cli-0.22.0/tests/tools/test_runtime.py +64 -0
  66. gflow_cli-0.22.0/tests/tools/test_spec.py +97 -0
  67. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/uv.lock +1 -1
  68. gflow_cli-0.21.0/tests/data/test_recorder.py +0 -214
  69. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/README.md +0 -0
  70. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/active.md +0 -0
  71. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/branch-review.md +0 -0
  72. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/changelog.md +0 -0
  73. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/check.md +0 -0
  74. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/doc-review.md +0 -0
  75. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/known-issues.md +0 -0
  76. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/next.md +0 -0
  77. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/plan.md +0 -0
  78. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/predict.md +0 -0
  79. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/scenario.md +0 -0
  80. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.claude/commands/gflow/status.md +0 -0
  81. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.env.template +0 -0
  82. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.gitattributes +0 -0
  83. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/CODEOWNERS +0 -0
  84. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  85. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/copilot-instructions.md +0 -0
  86. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/dependabot.yml +0 -0
  87. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/workflows/ci.yml +0 -0
  88. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/workflows/external-pr-triage.yml +0 -0
  89. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/workflows/governance-advisory.yml +0 -0
  90. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/workflows/governance-benchmark.yml +0 -0
  91. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.github/workflows/release.yml +0 -0
  92. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.gitleaks.toml +0 -0
  93. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.pre-commit-config.yaml +0 -0
  94. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/.secrets.baseline +0 -0
  95. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/CLAUDE.md +0 -0
  96. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/DISCLAIMER.md +0 -0
  97. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/GEMINI.md +0 -0
  98. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/KNOWN_ISSUES.md +0 -0
  99. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/LICENSE +0 -0
  100. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/RELEASE.md +0 -0
  101. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/ROADMAP.md +0 -0
  102. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/conftest.py +0 -0
  103. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docker-compose.yml +0 -0
  104. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/AGENT_GUIDE.md +0 -0
  105. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/AGENT_UI_E2E.md +0 -0
  106. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/AGENT_UI_RECON.md +0 -0
  107. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/ARCHITECTURE.md +0 -0
  108. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/AUTHENTICATION.md +0 -0
  109. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/CHARACTER.md +0 -0
  110. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/CHARACTER_RECON.md +0 -0
  111. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/DATA_LAYER.md +0 -0
  112. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/DEBUGGING.md +0 -0
  113. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/DEMOS.md +0 -0
  114. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/DEVELOPMENT.md +0 -0
  115. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/E2E_TESTING.md +0 -0
  116. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/EXTERNAL_STORAGE.md +0 -0
  117. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/GITHUB.md +0 -0
  118. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  119. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  120. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  121. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  122. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  123. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  124. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  125. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  126. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  127. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  128. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  129. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  130. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  131. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  132. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  133. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  134. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  135. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  136. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  137. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  138. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/MCP.md +0 -0
  139. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/MOVIE.md +0 -0
  140. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/SECURITY.md +0 -0
  141. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/USER_GUIDE.md +0 -0
  142. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/assets/demo-split-pf.gif +0 -0
  143. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/assets/example-run.gif +0 -0
  144. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/assets/examples.webp +0 -0
  145. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/medium_tutorial.md +0 -0
  146. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/schemas/movie-handoff.schema.json +0 -0
  147. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/sonar-cleanup-tracker.md +0 -0
  148. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  149. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  150. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  151. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  152. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  153. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  154. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  155. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +0 -0
  156. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +0 -0
  157. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +0 -0
  158. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +0 -0
  159. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  160. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  161. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  162. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/README.md +0 -0
  163. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/batch_from_config.py +0 -0
  164. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/multi_prompt_t2i.py +0 -0
  165. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/sample_config.json +0 -0
  166. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/sample_prompts.txt +0 -0
  167. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/single_image_t2i.py +0 -0
  168. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/examples/workflow_chain.py +0 -0
  169. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/llms.txt +0 -0
  170. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/README.md +0 -0
  171. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/01_upload_image.json +0 -0
  172. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  173. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  174. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/04_archive_workflow.json +0 -0
  175. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/05_createProject.json +0 -0
  176. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/06_batchGenerateImages.json +0 -0
  177. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  178. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  179. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  180. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  181. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  182. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/12_create_scene.json +0 -0
  183. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  184. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/14_get_scene_workflows.json +0 -0
  185. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  186. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/ci/check_doc_links.py +0 -0
  187. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/ci/check_materiality.py +0 -0
  188. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/ci/check_repo_hygiene.py +0 -0
  189. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/debug_editor.py +0 -0
  190. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/debug_gen_settings.py +0 -0
  191. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/debug_settings.py +0 -0
  192. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/_recording_client.py +0 -0
  193. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/_spike_common.py +0 -0
  194. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/active_plan.py +0 -0
  195. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  196. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  197. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  198. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  199. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  200. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  201. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/capture_locale_invariants.py +0 -0
  202. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  203. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/character_create_spike.py +0 -0
  204. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/character_create_spike_v2.py +0 -0
  205. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/dump_character_selectors.js +0 -0
  206. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/make_project.py +0 -0
  207. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/materiality_backtest.py +0 -0
  208. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/monitor_pr_38.py +0 -0
  209. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/patch_character.py +0 -0
  210. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/skillopt/README.md +0 -0
  211. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/skillopt/harness.py +0 -0
  212. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/skillopt/tasks.json +0 -0
  213. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  214. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  215. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  216. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  217. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  218. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  219. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  220. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  221. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  222. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  223. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  224. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  225. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  226. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_patch_entity.py +0 -0
  227. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/dev/spike_patchright.py +0 -0
  228. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/diag/README.md +0 -0
  229. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/diag/capture_flow_traffic.py +0 -0
  230. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/diag/memory_profile.py +0 -0
  231. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/diag/recaptcha_mint.py +0 -0
  232. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  233. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  234. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/record_demo.ps1 +0 -0
  235. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/smoke_image.py +0 -0
  236. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/smoke_real_chrome_image.py +0 -0
  237. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/smoke_video_editor.py +0 -0
  238. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/smoke_worker_style.py +0 -0
  239. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/scripts/verify_chrome_auth_viability.py +0 -0
  240. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/README.md +0 -0
  241. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/gflow-cli/SKILL.md +0 -0
  242. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/plan/SKILL.md +0 -0
  243. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/pr-council-review/SKILL.md +0 -0
  244. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/predict/SKILL.md +0 -0
  245. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/scenario/SKILL.md +0 -0
  246. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/skills/status/SKILL.md +0 -0
  247. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/sonar-project.properties +0 -0
  248. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/__main__.py +0 -0
  249. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/__init__.py +0 -0
  250. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/_engine.py +0 -0
  251. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/_retry.py +0 -0
  252. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  253. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/character.py +0 -0
  254. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/client.py +0 -0
  255. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/dto.py +0 -0
  256. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/image_upscale.py +0 -0
  257. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/recaptcha.py +0 -0
  258. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/routes.py +0 -0
  259. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/scene.py +0 -0
  260. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  261. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/_common.py +0 -0
  262. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  263. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/base.py +0 -0
  264. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  265. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  266. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  267. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  268. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  269. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  270. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  271. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  272. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  273. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
  274. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  275. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/__init__.py +0 -0
  276. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/base.py +0 -0
  277. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/cookies.py +0 -0
  278. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/factory.py +0 -0
  279. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  280. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  281. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/strategies.py +0 -0
  282. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/auth/verification.py +0 -0
  283. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/browser_manager.py +0 -0
  284. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/chain_manifest.py +0 -0
  285. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_character.py +0 -0
  286. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_data.py +0 -0
  287. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_models.py +0 -0
  288. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_movie.py +0 -0
  289. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_run.py +0 -0
  290. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/cli_scene.py +0 -0
  291. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/composition.py +0 -0
  292. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/__init__.py +0 -0
  293. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/chain_repo.py +0 -0
  294. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  295. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  296. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  297. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  298. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  299. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  300. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  301. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  302. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/queries.py +0 -0
  303. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/redaction.py +0 -0
  304. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/data/store.py +0 -0
  305. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/errors.py +0 -0
  306. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/exceptions.py +0 -0
  307. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/json_output.py +0 -0
  308. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/manifest.py +0 -0
  309. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/mcp/__init__.py +0 -0
  310. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/mcp/resources.py +0 -0
  311. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/mcp/server.py +0 -0
  312. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/media.py +0 -0
  313. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/movie_manifest.py +0 -0
  314. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/observability.py +0 -0
  315. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/profile_store.py +0 -0
  316. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/services/__init__.py +0 -0
  317. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/services/character_create.py +0 -0
  318. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/storage.py +0 -0
  319. {gflow_cli-0.21.0/tests → gflow_cli-0.22.0/src/gflow_cli/tools}/__init__.py +0 -0
  320. {gflow_cli-0.21.0/tests/api → gflow_cli-0.22.0/src/gflow_cli/tools/builtin}/__init__.py +0 -0
  321. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/ui/app.py +0 -0
  322. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/ui/server.py +0 -0
  323. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/worker/daemon.py +0 -0
  324. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/src/gflow_cli/worker/queue.py +0 -0
  325. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tasks/lessons.md +0 -0
  326. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/test_assets/sample_batch.json +0 -0
  327. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/test_assets/sample_batch.tsv +0 -0
  328. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/test_assets/sample_batch_invalid.tsv +0 -0
  329. {gflow_cli-0.21.0/tests/api/transports → gflow_cli-0.22.0/tests}/__init__.py +0 -0
  330. {gflow_cli-0.21.0/tests/api/transports/drivers → gflow_cli-0.22.0/tests/api}/__init__.py +0 -0
  331. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/fixtures/character_gen_response.json +0 -0
  332. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  333. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  334. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  335. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_bearer_redaction.py +0 -0
  336. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_character.py +0 -0
  337. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client.py +0 -0
  338. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_character.py +0 -0
  339. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_delete_characters.py +0 -0
  340. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_generate_character.py +0 -0
  341. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_image.py +0 -0
  342. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_launch_kwargs.py +0 -0
  343. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_patch_entity.py +0 -0
  344. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_scene.py +0 -0
  345. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_client_upscale.py +0 -0
  346. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_concurrency.py +0 -0
  347. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_dto.py +0 -0
  348. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_engine.py +0 -0
  349. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_image.py +0 -0
  350. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_image_dto.py +0 -0
  351. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_image_upscale.py +0 -0
  352. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  353. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_recaptcha.py +0 -0
  354. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_retry.py +0 -0
  355. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_routes.py +0 -0
  356. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_routes_character.py +0 -0
  357. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_routes_scene.py +0 -0
  358. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_sapisidhash_helper.py +0 -0
  359. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_scene_models.py +0 -0
  360. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_video.py +0 -0
  361. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/test_video_request.py +0 -0
  362. {gflow_cli-0.21.0/tests/cli → gflow_cli-0.22.0/tests/api/transports}/__init__.py +0 -0
  363. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/conftest.py +0 -0
  364. {gflow_cli-0.21.0/tests/data → gflow_cli-0.22.0/tests/api/transports/drivers}/__init__.py +0 -0
  365. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  366. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/drivers/test_factory.py +0 -0
  367. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_base.py +0 -0
  368. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_bearer.py +0 -0
  369. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_common.py +0 -0
  370. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  371. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_factory.py +0 -0
  372. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_fingerprint.py +0 -0
  373. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_sapisidhash.py +0 -0
  374. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_transport_timeout.py +0 -0
  375. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation.py +0 -0
  376. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  377. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  378. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  379. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  380. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/auth/strategies/test_factory.py +0 -0
  381. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/auth/strategies/test_strategies.py +0 -0
  382. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/auth/test_verification.py +0 -0
  383. {gflow_cli-0.21.0/tests/e2e → gflow_cli-0.22.0/tests/cli}/__init__.py +0 -0
  384. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_auth_list.py +0 -0
  385. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_character.py +0 -0
  386. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_character_create.py +0 -0
  387. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_data.py +0 -0
  388. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  389. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  390. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_image_upscale.py +0 -0
  391. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_models.py +0 -0
  392. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_movie.py +0 -0
  393. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_run.py +0 -0
  394. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_scene.py +0 -0
  395. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_cli_video_chain.py +0 -0
  396. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_error_handling.py +0 -0
  397. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_movie_manifest.py +0 -0
  398. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/cli/test_settings_validation.py +0 -0
  399. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/composition/test_character.py +0 -0
  400. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/composition/test_compose_prompt.py +0 -0
  401. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/composition/test_handoff.py +0 -0
  402. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/conftest.py +0 -0
  403. {gflow_cli-0.21.0/tests/features → gflow_cli-0.22.0/tests/data}/__init__.py +0 -0
  404. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_chain_repo.py +0 -0
  405. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_find_incomplete_character.py +0 -0
  406. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_models.py +0 -0
  407. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_packaging.py +0 -0
  408. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_recorder_character.py +0 -0
  409. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_redaction.py +0 -0
  410. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_repository.py +0 -0
  411. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_scene_persistence.py +0 -0
  412. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/data/test_settings_and_errors.py +0 -0
  413. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/dev/test_recording_client.py +0 -0
  414. {gflow_cli-0.21.0/tests/fixtures → gflow_cli-0.22.0/tests/e2e}/__init__.py +0 -0
  415. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/conftest.py +0 -0
  416. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  417. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  418. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_chain_e2e.py +0 -0
  419. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_character_create_e2e.py +0 -0
  420. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_daemon_e2e.py +0 -0
  421. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  422. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  423. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  424. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  425. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_json_output_e2e.py +0 -0
  426. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  427. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_scene_compose_live.py +0 -0
  428. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_transports_e2e.py +0 -0
  429. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  430. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  431. {gflow_cli-0.21.0/tests/image_batch → gflow_cli-0.22.0/tests/features}/__init__.py +0 -0
  432. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/auth.feature +0 -0
  433. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/auth_login.feature +0 -0
  434. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/character_create.feature +0 -0
  435. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/character_read.feature +0 -0
  436. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/conftest.py +0 -0
  437. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/image.feature +0 -0
  438. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/image_upscale.feature +0 -0
  439. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/locale_picker_include.feature +0 -0
  440. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_auth_login_steps.py +0 -0
  441. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_auth_steps.py +0 -0
  442. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_character_create_steps.py +0 -0
  443. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_character_read_steps.py +0 -0
  444. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_image_steps.py +0 -0
  445. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_image_upscale_steps.py +0 -0
  446. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  447. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_step_collision_guard.py +0 -0
  448. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  449. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/test_video_chain_steps.py +0 -0
  450. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/video_agent_ui.feature +0 -0
  451. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/features/video_chain.feature +0 -0
  452. {gflow_cli-0.21.0/tests/integration → gflow_cli-0.22.0/tests/fixtures}/__init__.py +0 -0
  453. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/fixtures/seeded_catalog.py +0 -0
  454. {gflow_cli-0.21.0/tests/services → gflow_cli-0.22.0/tests/image_batch}/__init__.py +0 -0
  455. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/image_batch/test_image_manifest.py +0 -0
  456. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/image_batch/test_observability_events.py +0 -0
  457. {gflow_cli-0.21.0/tests/smoke → gflow_cli-0.22.0/tests/integration}/__init__.py +0 -0
  458. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/integration/conftest.py +0 -0
  459. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/integration/constants.py +0 -0
  460. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/integration/test_storage_gcs.py +0 -0
  461. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/integration/test_storage_s3.py +0 -0
  462. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/mcp/__init__.py +0 -0
  463. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/mcp/conftest.py +0 -0
  464. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/mcp/test_stdio_transport.py +0 -0
  465. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  466. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  467. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/scripts/test_check_materiality.py +0 -0
  468. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  469. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/scripts/test_materiality_backtest.py +0 -0
  470. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/services/test_character_create_redaction.py +0 -0
  471. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/services/test_character_create_saga.py +0 -0
  472. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  473. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  474. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/smoke/test_real_flow.py +0 -0
  475. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_auth.py +0 -0
  476. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_browser_manager.py +0 -0
  477. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_chain.py +0 -0
  478. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_chain_manifest.py +0 -0
  479. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_cli_data.py +0 -0
  480. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_config.py +0 -0
  481. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_conftest_isolation.py +0 -0
  482. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_data_queries.py +0 -0
  483. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_documentation_gate.py +0 -0
  484. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_errors.py +0 -0
  485. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_errors_403.py +0 -0
  486. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_json_output.py +0 -0
  487. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_manifest.py +0 -0
  488. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_marker_registry.py +0 -0
  489. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_media.py +0 -0
  490. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_observability.py +0 -0
  491. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_paths.py +0 -0
  492. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_profile_store.py +0 -0
  493. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/test_smoke.py +0 -0
  494. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/ui/test_app.py +0 -0
  495. {gflow_cli-0.21.0 → gflow_cli-0.22.0}/tests/worker/test_daemon.py +0 -0
@@ -8,4 +8,10 @@ description: Multi-dimensional LLM council review of an open PR. Five baseline d
8
8
 
9
9
  > Do **not** call `Skill(skill="pr-council-review")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable (only `.claude/commands/gflow/*` are). Invoking it errors with `Unknown skill: pr-council-review`. Read the file directly instead.
10
10
 
11
+ **Required gate — SonarCloud must be green.** The council reviews the *diff*; it does
12
+ not see SonarCloud's verdict. Before declaring the final verdict, run **`/gflow:sonar`**
13
+ for this PR — the `SonarCloud analysis` gate must be green (zero new issues). A red gate
14
+ is a blocking finding regardless of the council's own conclusions; report it with the
15
+ exact failing conditions and do not call the PR merge-ready until it is green.
16
+
11
17
  Sibling: `/review` is the single-agent Claude-Code built-in (fast, one-pass). Use it for spot-checks; use this command for pre-merge multi-dim audits.
@@ -198,8 +198,10 @@ gh pr create --base main --head chore/release-v<NEW_VERSION> \
198
198
  --title "chore(release): v<NEW_VERSION>"
199
199
  ```
200
200
 
201
- Wait for PR CI to go green (`gh pr checks <N> --watch`), then merge with a **merge
202
- commit**never squash:
201
+ Wait for PR CI to go green (`gh pr checks <N> --watch`). **The `SonarCloud analysis`
202
+ check must be green (gate passed) not just the test matrix.** If it is red or you
203
+ want the verdict, run `/gflow:sonar <N>` and drive it to zero before merging. Then
204
+ merge with a **merge commit** — never squash:
203
205
 
204
206
  ```bash
205
207
  gh pr merge <N> --merge --delete-branch
@@ -0,0 +1,82 @@
1
+ ---
2
+ description: Check the SonarCloud quality gate for a PR (or the current branch) and drive it to zero. Reports GREEN, or the exact PR-scoped new issues/hotspots/coverage gaps to fix.
3
+ ---
4
+
5
+ # `/gflow:sonar [PR#]` — SonarCloud quality gate
6
+
7
+ The reusable Sonar primitive. `/gflow:check` is **local** and cannot see Sonar (it
8
+ is server-side, post-push); `/gflow:pr-council-review` is an LLM diff review, not the
9
+ gate verdict. This command answers one question: **is the SonarCloud gate green
10
+ (zero new issues) for this PR, and if not, exactly what must be fixed?**
11
+
12
+ `$ARGUMENTS` is the PR number. If empty, resolve it from the current branch
13
+ (`gh pr view --json number -q .number`).
14
+
15
+ Project: key `ffroliva_gflow-cli`, org `ffroliva-github` (see `sonar-project.properties`).
16
+ The CI scan sets `sonar.qualitygate.wait=true`, so a **green `SonarCloud analysis`
17
+ check means the gate genuinely passed** — but the gate **API is stale until that
18
+ check finishes**, so always check the GitHub check FIRST.
19
+
20
+ ## Steps
21
+
22
+ **1. Check the GitHub check first (never trust the gate API while it's pending).**
23
+
24
+ ```bash
25
+ gh pr checks <N> --json name,state,bucket | \
26
+ jq -r '.[] | select(.name=="SonarCloud analysis") | "\(.bucket) \(.state)"'
27
+ ```
28
+
29
+ - `pass` → **gate is GREEN / zero new issues. Done.** Report GREEN and stop.
30
+ - `pending` → the SonarCloud job (~50s) runs *after* the ~3.5min test matrix; wait
31
+ (`gh pr checks <N> --watch`) before reading the API, or the API returns the
32
+ previous commit's verdict.
33
+ - `fail` → continue to step 2 to enumerate the exact failing conditions.
34
+
35
+ **2. Enumerate the failing conditions (PR-scoped — this is the #1 gotcha).**
36
+
37
+ New-code issues live on the PR branch, NOT `main`. **Scope every call with
38
+ `&pullRequest=<N>`** or the API reports 0 and you chase phantoms. Token is in
39
+ `.env.local` as `SONAR_TOKEN` — read it inside a sandbox so it never lands in chat.
40
+ `curl` may be blocked by the context-mode hook → use `ctx_execute` (javascript
41
+ `fetch` with `Authorization: Basic base64(token+":")`).
42
+
43
+ ```bash
44
+ # Which gate conditions are ERROR:
45
+ GET /api/qualitygates/project_status?projectKey=ffroliva_gflow-cli&pullRequest=<N>
46
+ # New issues (bugs/smells) with file:line + rule + creationDate:
47
+ GET /api/issues/search?componentKeys=ffroliva_gflow-cli&pullRequest=<N>&resolved=false
48
+ # Unreviewed security hotspots:
49
+ GET /api/hotspots/search?projectKey=ffroliva_gflow-cli&pullRequest=<N>&status=TO_REVIEW
50
+ ```
51
+
52
+ **3. Fix by condition — no gaming.**
53
+
54
+ - **`new_coverage < 80%`** → add **real** unit tests for the uncovered new lines
55
+ (usually a new orchestration/`_run_*`/helper). There is NO mark-safe shortcut and
56
+ NEVER widen `sonar.coverage.exclusions` to dodge it.
57
+ - **`new_code_smells` / `new_maintainability_rating` (e.g. S1192 duplicated literal,
58
+ S3776 cognitive complexity)** → fix at source. For a duplicated literal your diff
59
+ merely *touched*, collapse it to one module-scope alias so it falls under the
60
+ threshold (pyright/tests prove it's safe). For S7497, re-raise swallowed
61
+ `asyncio.CancelledError`.
62
+ - **`new_security_hotspots_reviewed < 100%`** → only for a **genuine** false positive:
63
+ `POST /api/hotspots/change_status` form body
64
+ `hotspot=<key>&status=REVIEWED&resolution=SAFE&comment=<justification>` (204 = ok),
65
+ then **re-run the SonarCloud job** so it reposts the GitHub status
66
+ (`gh run rerun <run-id> --job <sonar-job-id>` — the coverage artifact is reused).
67
+ Never mark a real hotspot SAFE.
68
+
69
+ **4. Push fixes, then re-verify from step 1** (the check must read `pass`).
70
+
71
+ ## Output
72
+
73
+ - Verdict: **GREEN** (gate passed, zero new issues) or **RED** with the exact failing
74
+ conditions and a fix list (`file:line · rule · what to do`).
75
+ - After any fix: re-confirm via step 1 — green check = gate passed.
76
+
77
+ ## See also
78
+
79
+ - `docs/GITHUB.md` § SonarCloud Quality Gate — full policy + coverage-exclusion rationale.
80
+ - `/gflow:check` — the local pre-commit gates (coverage floor pre-empts `new_coverage`).
81
+ - Memory: [[sonarcloud-pr-issues-scope-s7497]], [[sonarcloud-new-code-gotchas]],
82
+ [[sonarcloud-hotspot-review-workflow]], [[sonarcloud-setup]].
@@ -0,0 +1,50 @@
1
+ name: Guard main base
2
+
3
+ # Blocks the divergence class that bit v0.21.0: a non-release branch merged
4
+ # straight into `main` (PR #203 — base mistakenly set to `main`, then squashed),
5
+ # which bypassed `develop` and skipped the `main -> develop` back-merge, leaving
6
+ # `main` ahead of `develop` by an orphaned squash commit.
7
+ #
8
+ # Policy: only `chore/release-*` (cut by /gflow:release) or `hotfix/*` branches
9
+ # may target `main`. Everything else must go through `develop` (the default /
10
+ # integration branch). Dependabot and normal PRs already default to `develop`,
11
+ # so this only catches a deliberate, mistaken `--base main`.
12
+ #
13
+ # The job runs on EVERY PR and passes trivially when the base is not `main`, so
14
+ # it is safe to mark as a *required* status check on `main` without blocking
15
+ # `develop` PRs (which would otherwise hang as "expected — waiting").
16
+
17
+ on:
18
+ pull_request:
19
+ types: [opened, reopened, edited, synchronize]
20
+
21
+ permissions:
22
+ contents: read
23
+
24
+ jobs:
25
+ guard:
26
+ name: Only release/hotfix branches may target main
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - name: Verify base/head pairing
30
+ env:
31
+ BASE_REF: ${{ github.base_ref }}
32
+ HEAD_REF: ${{ github.head_ref }}
33
+ run: |
34
+ echo "PR head '$HEAD_REF' -> base '$BASE_REF'"
35
+ if [ "$BASE_REF" != "main" ]; then
36
+ echo "Base is '$BASE_REF' (not main) — nothing to enforce."
37
+ exit 0
38
+ fi
39
+ case "$HEAD_REF" in
40
+ chore/release-*|hotfix/*)
41
+ echo "OK: '$HEAD_REF' is allowed to target 'main'."
42
+ ;;
43
+ *)
44
+ echo "::error title=Wrong base branch::PR head '$HEAD_REF' must not target 'main'."
45
+ echo "Only 'chore/release-*' (via /gflow:release) or 'hotfix/*' branches may merge into 'main'."
46
+ echo "Feature, CI, fix, docs, and dependency work must target 'develop' (the integration branch)."
47
+ echo "Fix: re-target this PR to 'develop', or — if this really is a release — rename the branch to 'chore/release-vX.Y.Z'."
48
+ exit 1
49
+ ;;
50
+ esac
@@ -32,12 +32,15 @@ htmlcov/
32
32
  .DS_Store
33
33
 
34
34
  # Project-specific — secrets / session storage (NEVER commit)
35
- auth/ # any project-local auth dir
36
- profile_*/ # Chromium persistent contexts (any name)
37
- *.cookies.json # exported cookie jars
38
- storage_state.json # Playwright storage_state output
39
- secrets.json # generic secrets file
40
- .env # local env overrides (the .env.template IS committed)
35
+ # NOTE: git does NOT support trailing inline comments in .gitignore — a `#` only
36
+ # starts a comment at the START of a line. Keep each pattern on its own line so
37
+ # the comment text isn't folded into the pattern (which silently un-ignores it).
38
+ /auth/
39
+ profile_*/
40
+ *.cookies.json
41
+ storage_state.json
42
+ secrets.json
43
+ .env
41
44
  .env.local
42
45
  .env.*.local
43
46
 
@@ -93,3 +96,6 @@ worktrees/
93
96
  # Understand Anything (local knowledge graph)
94
97
  .understand-anything/
95
98
  .worktrees
99
+
100
+ # Subagent-driven-development scratch (ledger + task reports)
101
+ .superpowers/
@@ -50,6 +50,7 @@ Or invoke the wrapper: `/gflow:check`.
50
50
  - Use `pytest -m "not live and not e2e and not smoke"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
51
51
  - TDD is non-negotiable. Coverage floor: 80% overall.
52
52
  - Documentation is a first-class deliverable. Every behavior, workflow, config, or operator-facing change must update the relevant docs or state why no docs changed in the PR/checklist. `scripts/ci/check_doc_links.py` is a merge gate.
53
+ - **A PR is not done until its SonarCloud gate is green (zero new issues).** The six gates above are local/pre-commit; SonarCloud is server-side and runs in CI (`sonar.qualitygate.wait=true` → a red gate turns the `SonarCloud analysis` check red). Before calling a PR merge-ready, verify it with `/gflow:sonar <N>` (it is skipped on fork PRs — maintainer-checked there).
53
54
  - Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`. E2E tests require `GFLOW_CLI_E2E_PROFILE`.
54
55
 
55
56
  ## Code style
@@ -7,6 +7,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.22.0] — 2026-06-28
11
+
12
+ ### Added
13
+
14
+ - **Tools framework ("Creative Director")**: a TOML-defined prompt-tool system with
15
+ `creative-director` as the first built-in tool, exposed via two surfaces:
16
+ - **`gflow tools list/show/run`** — discover tools, inspect their styles, and run them
17
+ standalone (e.g. `gflow tools run creative-director "a cat" --style cinema --json`).
18
+ - **`-t` / `--tool` option** on every generation command — `image t2i` / `i2i` / `batch`,
19
+ `video t2v` / `i2v` / `r2v` / `chain` — apply one or more tools before generating
20
+ (e.g. `--tool creative-director:style=cinema`). Repeatable. On multi-prompt batches and
21
+ chains the tool is applied per prompt/link. Replaces the never-released `-e/--expand` flag.
22
+ - The `creative-director` tool rewrites a terse prompt into a vivid one using Google's
23
+ five-component formula (Subject + Action + Context/Location + Composition/Camera + Style)
24
+ via the public Gemini API. Requires `GFLOW_CLI_GEMINI_API_KEY`
25
+ ([get one](https://aistudio.google.com/apikey)); optional `GFLOW_CLI_GEMINI_MODEL`
26
+ (default `gemini-2.5-flash`). Domain-vocabulary modes (`--style cinema`, `portrait`,
27
+ `product`, etc.) inject specialized lens/lighting/colour vocabulary; styles are
28
+ **category-gated**, so image styles apply to image commands and video styles to video.
29
+ - Tool application is **never fatal** — missing key, rate limit, or any API/network fault
30
+ degrades gracefully to the original prompt.
31
+ - **History**: a generation rewritten by a tool records the user's original prompt in the
32
+ `prompt` column, the submitted expansion in `expanded_prompt`, and the applied tool
33
+ (`{name, version, model, params, config_hash}`) in `operations.metadata_json.tool` — all
34
+ honoring `GFLOW_CLI_HISTORY_PROMPTS=redacted` (the redacted form stores only
35
+ `{name, version, params_hash, config_hash}`).
36
+ - MCP parity: `gflow_list_tools` tool and a `tools` array parameter (`[{name, options}]`) on
37
+ `gflow_generate_image` / `gflow_generate_video`, validated and adapted to the CLI
38
+ `--tool` form.
39
+ - **"My Tools"**: drop your own tool TOMLs into `<GFLOW_CLI_HOME>/tools/*.toml` and they are
40
+ registered automatically — listed by `gflow tools list`, usable via `--tool`, and exposed over
41
+ MCP, just like built-ins. A user tool may override a built-in of the same name (logged via
42
+ `tool_user_override`); a malformed user TOML fails loud. See [docs/TOOLS.md](docs/TOOLS.md).
43
+ - The Gemini prompt expander gained an overall **wall-clock budget** (default ~60s per call)
44
+ on top of the lowered 20s per-attempt timeout, so sustained rate limiting can no longer
45
+ block a generation for the full retry schedule before falling back to the original prompt.
46
+
47
+ ### Deprecated
48
+
49
+ - **`expand_prompt` MCP prompt**: superseded by the `creative-director` tool, which performs the
50
+ rewrite server-side (calls Gemini, strips banned keywords, supports domain styles, records
51
+ provenance). The prompt still works and now carries a `[DEPRECATED]` marker in its
52
+ client-visible description; it is slated for removal in a future major release. Use
53
+ `gflow tools run creative-director` / `--tool` (CLI) or `gflow_list_tools` + the `tools` array
54
+ param (MCP) instead.
55
+
10
56
  ## [0.21.0] — 2026-06-26
11
57
 
12
58
  ### Added
@@ -1582,7 +1628,8 @@ shell-script template that branches on these codes.
1582
1628
 
1583
1629
  First skeleton. Not functional end-to-end yet.
1584
1630
 
1585
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...HEAD
1631
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...HEAD
1632
+ [0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
1586
1633
  [0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
1587
1634
  [0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
1588
1635
  [0.20.0]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...v0.20.0
@@ -9,6 +9,8 @@
9
9
  | `GFLOW_CLI_BROWSER` | `auto` | Browser mode. See **Browser mode** section below. |
10
10
  | `CHROME_BINARY` | (autodetect) | Override Chrome binary path. Falls back to platform-standard locations. |
11
11
  | `GFLOW_CLI_CONCURRENCY` | `4` | Maximum parallel API requests per batch. |
12
+ | `GFLOW_CLI_GEMINI_API_KEY` | _(unset)_ | Public Gemini key enabling prompt expansion (`-e`/`--expand`). Unset = expansion is a graceful no-op. [Get one](https://aistudio.google.com/apikey). |
13
+ | `GFLOW_CLI_GEMINI_MODEL` | `gemini-2.5-flash` | Gemini model used for prompt expansion. |
12
14
  | `GFLOW_LIVE` | _(unset)_ | Set to `1` to enable live-API test markers (`@pytest.mark.live`). |
13
15
 
14
16
  ---
@@ -102,6 +102,23 @@ pip install pre-commit && pre-commit install
102
102
 
103
103
  The `.pre-commit-config.yaml` already ships ruff and the hygiene gate.
104
104
 
105
+ ### SonarCloud quality gate
106
+
107
+ On top of the six gates, CI runs a **SonarCloud** analysis whose quality gate must be
108
+ **green** before a PR is merge-ready — the target is **zero new issues** on changed code
109
+ (new bugs, vulnerabilities, and code smells = 0; coverage of new lines ≥ 80%; security
110
+ hotspots reviewed = 100%). The local `--cov-fail-under=80` gate already pre-empts the
111
+ coverage condition, so if your tests are green locally you have usually cleared the part
112
+ of the gate you can run yourself.
113
+
114
+ SonarCloud is **server-side and maintainer-run**: it needs a repo secret (`SONAR_TOKEN`)
115
+ that, for security, GitHub does **not** share with pull requests from forks. So **on a
116
+ fork PR the SonarCloud check is skipped** — you cannot run it, and that is expected. A
117
+ maintainer checks the gate before merging (and, for fork PRs, may re-run the branch
118
+ internally to produce an analysis). Don't worry if you see the SonarCloud check absent or
119
+ skipped on your PR; focus on keeping the six local gates green and your diff free of new
120
+ smells. Full policy: [`docs/GITHUB.md`](docs/GITHUB.md) § SonarCloud Quality Gate.
121
+
105
122
  ### Script output convention
106
123
 
107
124
  All runtime output — smoke runs, debug dumps, generated images — **must** go
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.21.0
3
+ Version: 0.22.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
@@ -94,6 +94,7 @@ You pay for Google AI Ultra or Pro, you have Veo credits, and you run real batch
94
94
 
95
95
  - **Batch generation.** Loop prompts straight from the shell: `for p in $(cat prompts.txt); do gflow image t2i "$p"; done`. Image batching plus `gflow video t2v` / `i2v` / `r2v` all ship today.
96
96
  - **Consistent subjects.** `gflow character create` mints a Flow Character (face and body reference) so the same person appears from one generation to the next.
97
+ - **Prompt tools.** `--tool creative-director` rewrites a terse prompt into a vivid one (Google's 5-component formula) before generating — on any command. Bring your own with [My Tools](docs/TOOLS.md).
97
98
  - **Pipelines.** Wire Veo into your content automation, AI-video stack, or batch experiments.
98
99
  - **Terminal-native.** After one `gflow auth login`, you stay in the shell. No clicking through dialogs.
99
100
 
@@ -359,7 +359,13 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
359
359
  - **Phase 4 (Task #6, 2026-05-26, branch `claude/next-quick-win-gBPqS`, PR #93):** `NEW_PROJECT_SELECTORS` expanded to all 14 locales (icon-first tier + 14-locale text tier); English-only ARIA fallbacks (`[aria-label*='New project']`, `[aria-label*='Project']`) removed. `SUBMIT_BUTTON_SELECTORS` drops its English-only `button[aria-label*="Create"]` entry — `arrow_forward` icon selectors cover it in all locales. Both tuples are now fully locale-invariant. Note: issue #24 was closed 2026-05-24 after Phases 1–3; Phase 4 is cosmetic tail work. `--lang=en-US` retained only to stabilise `IMAGE_MODEL_OPTION_SELECTORS` (product names like "Nano Banana 2" may be localised). Removing it requires converting the image model picker to a structural anchor — tracked as issue #94 (Phase 5 below). **R2V live e2e on non-EN not yet exercised** — still open.
360
360
  - **Phase 5 (2026-05-30, branch `claude/issue-94-staleness-check-MnsEY`, PR #127):** `IMAGE_MODEL_OPTION_SELECTORS` and `VIDEO_MODEL_OPTION_SELECTORS` converted from `dict[Model, str]` to `dict[Model, tuple[str, ...]]` (cascade discipline; Tier 1 structural slots reserved for future DOM-probe-confirmed anchors). `--lang=en-US` removed from Chromium launch args — locale controlled by `locale=locale_env` Playwright kwarg (persists across all navigations including `/project/<uuid>` deep-links) + `FLOW_URL`'s `?hl=en` on initial load. Branded model names confirmed locale-stable. Four new `TestSelectorLocaleInvariance` tests + four `TestSelectImageModel` runtime tests. **R2V live e2e on non-EN still pending (owner gate — requires authenticated non-EN Chrome profile).**
361
361
  - [ ] **Model Context Protocol (MCP) Server.** (Backlog) Expose core gflow-cli tools via MCP for language-agnostic agentic access. Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md).
362
- - [ ] **Prompt Expansion ("Creative Director" mode).** (Backlog) Add an option to expand prompts using Google's official 5-component formula via Gemini. Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md).
362
+ - [x] **Tools framework + Prompt Expansion ("Creative Director") — shipped → develop (PRs #210 + #211, 2026-06-28).** Prompt expansion evolved from the never-released `-e`/`--expand` flag into a TOML-defined **Tools framework**: `creative-director` is the first built-in tool, invoked uniformly via `--tool/-t <name>[:k=v]` on every generation command (`image t2i`/`i2i`/`batch`, `video t2v`/`i2v`/`r2v`/`chain`) or standalone via `gflow tools list/show/run`. The tool rewrites a terse prompt via Gemini's 5-component formula (`src/gflow_cli/tools/`, stdlib-urllib expander, never-fatal: missing key / 429-backoff / network / empty-clean all fall back to the original), with 15 domain styles and deterministic banned-keyword stripping. `operations.expanded_prompt` records original + submitted expansion (withheld under `history_prompts=redacted`); `metadata_json.tool` records `{name, version, model, params, config_hash}` provenance (minimized in redacted mode). Reuses `GFLOW_CLI_GEMINI_API_KEY`; `GFLOW_CLI_GEMINI_MODEL` overrides. MCP parity: `gflow_list_tools` + a `tools` array param per AGENTS.md §61. Docs: [TOOLS.md](file:///C:/development/github/gflow-cli/docs/TOOLS.md) + [PROMPT_EXPANSION.md](file:///C:/development/github/gflow-cli/docs/PROMPT_EXPANSION.md). Memory `[[prompt-expansion-feature]]`.
363
+ - **PR #210 (framework):** `tools/` package (spec/loader/registry/runtime/expander/banned/invocation), `creative-director.toml`, `gflow tools list/show/run`, `--tool` on t2i/t2v (single-prompt guard kept), MCP `gflow_list_tools` + `tools` param.
364
+ - **PR #211 (broaden surface):** `original_prompt`/`tool` carried on the request DTOs (`GenerateImageRequest`/`GenerateVideoRequest`/`BatchPromptItem`/`ChainLinkSpec`); recorder reads `request.original_prompt` (kwarg retired); `metadata_json.tool` recording; `--tool` wired into i2i/batch/i2v/r2v/chain; single-prompt guard removed. Silent-misrecord hazard resolved by carrying `original_prompt` on the DTO rather than re-threading a kwarg through each recorder method.
365
+ - **Expander robustness — DONE 2026-06-28 (PR #214).** Per-attempt timeout lowered 30s→20s and an overall `max_total_seconds` wall-clock budget (default 60s) added to `tools/expander.py` — retries stop once the budget is spent and each attempt's timeout is clamped to the remaining budget, so sustained 429s can no longer block ~120s before fallback. `tenacity` (a dep) was evaluated and **rejected**: it is built around re-raising after retries whereas the expander must never raise (fall back to the original), and the per-attempt structlog + total-budget logic is clearer as a hand-rolled loop with injectable `transport`/`sleep`/`clock` seams.
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
+ - **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
+ - **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.
363
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).
364
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.
365
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]]`.
@@ -23,6 +23,7 @@ You pay for Google AI Ultra or Pro, you have Veo credits, and you run real batch
23
23
 
24
24
  - **Batch generation.** Loop prompts straight from the shell: `for p in $(cat prompts.txt); do gflow image t2i "$p"; done`. Image batching plus `gflow video t2v` / `i2v` / `r2v` all ship today.
25
25
  - **Consistent subjects.** `gflow character create` mints a Flow Character (face and body reference) so the same person appears from one generation to the next.
26
+ - **Prompt tools.** `--tool creative-director` rewrites a terse prompt into a vivid one (Google's 5-component formula) before generating — on any command. Bring your own with [My Tools](docs/TOOLS.md).
26
27
  - **Pipelines.** Wire Veo into your content automation, AI-video stack, or batch experiments.
27
28
  - **Terminal-native.** After one `gflow auth login`, you stay in the shell. No clicking through dialogs.
28
29
 
@@ -27,6 +27,9 @@ $env:GFLOW_CLI_HOME = "D:\gflow-cli" # PowerShell
27
27
  ```
28
28
 
29
29
  See [AUTHENTICATION § Session storage](AUTHENTICATION.md#session-storage) for the full layout.
30
+ `$GFLOW_CLI_HOME` also holds `config.toml`, the SQLite catalog (`gflow.db`), and — if you
31
+ create it — a `tools/` directory of user-authored "My Tools" TOMLs
32
+ (`<GFLOW_CLI_HOME>/tools/*.toml`, auto-loaded; see [TOOLS.md § My Tools](TOOLS.md)).
30
33
 
31
34
  ### `GFLOW_CLI_PROFILE`
32
35
 
@@ -112,11 +115,26 @@ Deep setup, verification, and security notes live in
112
115
 
113
116
  ### `GFLOW_CLI_GEMINI_API_KEY`
114
117
 
115
- **What:** API key for the official Veo 3.1 SDK.
116
- **Required when:** `GFLOW_CLI_PROVIDER=official`.
118
+ **What:** Public Gemini API key. Used by the **`creative-director`** prompt tool
119
+ (`--tool creative-director` / `gflow tools run creative-director`, see
120
+ [TOOLS.md](TOOLS.md) and [PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)) and, in future, by the
121
+ official Veo 3.1 SDK.
122
+ **Required when:** you apply the `creative-director` tool (via `--tool` on any generation
123
+ command, or `gflow tools run`), or `GFLOW_CLI_PROVIDER=official`.
117
124
  **Default:** unset
125
+ **Behavior when unset:** the tool is a no-op — gflow logs an `INFO` notice and generates
126
+ from your original prompt (it never fails the run). API errors (rate limit, network) fall
127
+ back the same way after a short exponential-backoff retry, bounded by an overall ~60s
128
+ wall-clock budget per call.
118
129
  **Get one:** <https://aistudio.google.com/apikey>
119
130
 
131
+ ### `GFLOW_CLI_GEMINI_MODEL`
132
+
133
+ **What:** Gemini model used by the `creative-director` prompt tool.
134
+ **Default:** `gemini-2.5-flash`
135
+ **Note:** Override to select a newer Flash revision without upgrading gflow-cli, e.g.
136
+ `GFLOW_CLI_GEMINI_MODEL=gemini-2.5-flash-lite`.
137
+
120
138
  ### `GFLOW_CLI_AUTH_LOGIN_TIMEOUT`
121
139
 
122
140
  **What:** Maximum time (seconds) that `gflow auth login` waits for the user to complete the Google sign-in flow in the browser.
@@ -179,6 +197,11 @@ Use this when you want the DB on a different volume, outside `GFLOW_CLI_HOME`, o
179
197
 
180
198
  **Default:** `store`
181
199
 
200
+ **Tool provenance:** when a prompt tool (e.g. `creative-director`) rewrites a prompt, `store`
201
+ mode also records the submitted `expanded_prompt` and a full `metadata_json.tool` descriptor;
202
+ `redacted` withholds the expanded prompt and reduces the descriptor to
203
+ `{name, version, params_hash, config_hash}`. See [PROMPT_EXPANSION.md](PROMPT_EXPANSION.md).
204
+
182
205
  ```bash
183
206
  GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
184
207
  ```
@@ -34,6 +34,9 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
34
34
  | **[docs/DATA_LAYER.md](DATA_LAYER.md)** | Local SQLite catalog: goals, schema, recording flow, redaction, `gflow data` CLI, migrations, extension guide | Anything touching `gflow_cli.data`, debugging missing rows, building I2V/repair tooling, auditing what is stored |
35
35
  | **[docs/CHARACTER.md](CHARACTER.md)** | Characters feature spec & system design: domain model, endpoint/cost matrix, sequence diagrams, JSON payloads (I/O), CLI surface, reuse via `referenceEntities` (#145) | Working on `gflow character`, reusing a character in generations, or understanding Flow's character wire protocol |
36
36
  | **[docs/MOVIE.md](MOVIE.md)** | `gflow movie` — multi-scene character-consistent films: manifest format, run lifecycle (browser stays open through generate→poll→download), entity-attach mechanism (Personagens right-click), resume/handoff, credits | Working on `gflow movie`, debugging scene generation, or understanding the character-entity attach + consistency model |
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
+ | **[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
+ | **[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 |
37
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 |
38
41
  | **[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) |
39
42
  | **[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) |
@@ -75,6 +78,8 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
75
78
  **"How do I chain clips into one continuous video (initial-frame I2V)?"** → [USAGE § `gflow video chain`](USAGE.md#gflow-video-chain)
76
79
  **"How do I stitch existing clips into one extended .mp4 (credit-free, no ffmpeg)?"** → [USAGE § `gflow scene`](USAGE.md#gflow-scene)
77
80
  **"How do I create a reusable character (face + body) I can reuse across generations?"** → [USAGE § `gflow character`](USAGE.md#gflow-character) · design: [CHARACTER](CHARACTER.md)
81
+ **"How do I turn a terse prompt into a vivid one before generating?"** → `--tool creative-director:style=cinema` on any generation command — see [PROMPT_EXPANSION](PROMPT_EXPANSION.md) · framework: [TOOLS](TOOLS.md)
82
+ **"What tools are available and what styles do they support?"** → run `gflow tools list` / `gflow tools show creative-director` — see [TOOLS](TOOLS.md)
78
83
  **"What preset voices can a character use?"** → run `gflow character voices` — see [USAGE § `gflow character voices`](USAGE.md#gflow-character-voices)
79
84
  **"My batch died with exit code 3 (auth) — what now?"** → [USER_GUIDE § Journey 7](USER_GUIDE.md#journey-7--recovering-from-an-authexpirederror-mid-batch)
80
85
  **"Exit code 4 (rate-limit) or 5 (content-policy) — how do I recover?"** → [USER_GUIDE § Journey 12](USER_GUIDE.md#journey-12--recovering-from-contentpolicyerror-or-ratelimiterror)
@@ -113,7 +118,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
113
118
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
114
119
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
115
120
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
116
- **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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). Prior: [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
121
+ **"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)
117
122
  **"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.
118
123
  **"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)
119
124
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,86 @@
1
+ # Live Verification — v0.22.0
2
+
3
+ Release theme: **Tools framework ("Creative Director")** — TOML-defined prompt tools, the
4
+ `gflow tools` group, the uniform `--tool/-t` option across all generation commands, "My Tools"
5
+ user-authored tools, MCP parity, and an expander wall-clock budget.
6
+
7
+ This file follows the project's release-evidence convention (a `LIVE_VERIFICATION_vX.Y.Z.md` per
8
+ release). It has two parts: **Pre-tag gates** (filled before signing) and **Post-tag evidence**
9
+ (filled after the live owner-run).
10
+
11
+ ---
12
+
13
+ ## Pre-tag gates
14
+
15
+ ### Automated coverage (CI-green on the release tree)
16
+
17
+ The entire feature set shipped via PRs #210/#211/#213 (framework + broaden + docs) and the
18
+ v0.22.0 follow-ups #214/#215/#216, **each merged to `develop` with full CI green** on Python
19
+ 3.11 / 3.12 / 3.13 and **SonarCloud quality gate at zero**:
20
+
21
+ | Surface | Coverage |
22
+ |---|---|
23
+ | `gflow tools list/show/run` | `tests/cli` + `tests/tools` |
24
+ | `--tool/-t` on `image t2i/i2i/batch`, `video t2v/i2v/r2v/chain` | `tests/cli`, `tests/features` (BDD), `tests/tools/test_runtime.py` |
25
+ | Tool schema / loader / registry | `tests/tools/test_spec.py`, `test_loader.py`, `test_registry.py` |
26
+ | Banned-keyword stripping | `tests/tools/test_banned.py` |
27
+ | Gemini expander (never-fatal, retries, **time budget**) | `tests/tools/test_expander.py` (incl. budget/timeout cases) |
28
+ | Provenance (`expanded_prompt`, `metadata_json.tool`, redaction) | `tests/data` recorder tests |
29
+ | MCP `gflow_list_tools` + `tools` array param + §61 parity | `tests/mcp/test_server.py` |
30
+ | `expand_prompt` deprecation marker | `tests/mcp/test_server.py::test_expand_prompt_is_marked_deprecated` |
31
+ | "My Tools" user-dir loader | `tests/tools/test_registry.py::TestMyToolsLoader` |
32
+
33
+ Local gates on the release tree: `pyright src` 0 errors, `ruff check` / `ruff format --check`
34
+ clean, `scripts/ci/check_repo_hygiene.py` clean, `scripts/ci/check_doc_links.py` all resolved.
35
+
36
+ ### Doc-review council
37
+
38
+ Council verdict: **RED / YELLOW / GREEN** across the 3 auditors (completeness / cross-reference /
39
+ drift). 1 RED finding (release-blocking) and the Tier-2 polish were **fixed in the release-prep
40
+ commit**; drift auditor was GREEN. Findings + resolutions:
41
+
42
+ - **Tier 1 (was blocking) — FIXED:** the canonical reference docs still documented the removed
43
+ `-e/--expand` flag and omitted the entire tools surface. Updated `docs/USAGE.md` (replaced the
44
+ `-e/--expand` option + section with `-t/--tool`; added a `gflow tools` command section) and
45
+ `docs/CONFIGURATION.md` (`GFLOW_CLI_GEMINI_API_KEY` / `_MODEL` now describe the `creative-director`
46
+ tool, not `--expand`; added the `<GFLOW_CLI_HOME>/tools/` My-Tools dir + redaction note).
47
+ - **Tier 2 — FIXED:** the expander wall-clock budget was undocumented — added to
48
+ `CHANGELOG [0.22.0]`, `PROMPT_EXPANSION.md §6`, and `TOOLS.md §3`; added a README feature line;
49
+ fixed the stale "dormant" `load_user_tools` docstring in `tools/loader.py`.
50
+ - **Tier 3 (deferred, cosmetic):** banned-keyword list ordering differs (set-equal, 13 terms);
51
+ the CLI-vs-MCP `tools list` field asymmetry (`requires_env`) could note it's deliberate.
52
+
53
+ Post-fix gates re-run green: `check_doc_links` (23 files), `ruff`/`ruff format`, `pyright src` 0,
54
+ `tests/tools`+`tests/mcp` 85 passed, repo-hygiene clean.
55
+
56
+ ### Live feature verification — ⏳ PENDING (owner-run)
57
+
58
+ The credit/key-gated live e2e is **deferred to a post-tag owner run** and is **not** met at
59
+ tag time. Reason: a true end-to-end check of `--tool creative-director` requires a real
60
+ `GFLOW_CLI_GEMINI_API_KEY`, an authenticated Flow profile, and (for the generation half) Veo
61
+ credits — none of which are available to the automated release agent. The tool path is
62
+ **never-fatal by design** (a missing key / API fault degrades to the original prompt), so this
63
+ does not risk a broken default install, but the live rewrite-and-record assertion below must
64
+ still be exercised by the owner.
65
+
66
+ Owner checklist (run after publish, then fill **Post-tag evidence**):
67
+
68
+ 1. `gflow tools list` shows `creative-director`; `gflow tools show creative-director` lists styles.
69
+ 2. `GFLOW_CLI_GEMINI_API_KEY=… gflow tools run creative-director "a cat on a couch" --style cinema --json`
70
+ → `was_expanded: true`, a vivid multi-sentence prompt, **no banned keywords** in output.
71
+ 3. A real generation with a tool, e.g.
72
+ `gflow image t2i "a fox in the snow" --tool creative-director:style=cinema` (image gen is
73
+ credit-free) → assert the catalog row records the **original** prompt in `prompt`, the
74
+ rewrite in `expanded_prompt`, and `metadata_json.tool = {name, version, model, params,
75
+ config_hash}` (`gflow data show <id> --json`).
76
+ 4. Redaction: repeat (3) with `GFLOW_CLI_HISTORY_PROMPTS=redacted` → `expanded_prompt` withheld;
77
+ `metadata_json.tool` reduced to `{name, version, params_hash, config_hash}`.
78
+ 5. "My Tools": drop a TOML in `<GFLOW_CLI_HOME>/tools/mytool.toml` → it appears in
79
+ `gflow tools list`; a same-named file overriding a builtin logs `tool_user_override`.
80
+
81
+ ---
82
+
83
+ ## Post-tag evidence
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.)_
@@ -4,9 +4,9 @@
4
4
 
5
5
  ## Current release
6
6
 
7
- **v0.17.0 — alpha.** **Cookie-store session verification.** `verify_flow_profile` (contributed by @3mora2, PR #168) verifies a Flow session directly from the Chrome cookie store via `browser_cookie3` + `httpx` a fast path that skips launching a browser with a marker-gated Playwright fallback for encrypted/locked stores (Windows DPAPI failures included) and retry/backoff on transient HTTP errors. Entity-attach `WireFormatError` failures (exit 7) now carry an issue-#174-aware remediation hint plus `entity_attach_context` drift telemetry. Live-verified 2026-06-12 ([evidence](LIVE_VERIFICATION_v0.17.0.md)). Carries forward v0.16.0 (locale-free picker include selectors #170, `gflow image upscale` #171) and v0.15.1 (Docker `/dev/shm` hardening, mid-workflow 401 detection).
7
+ **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
8
 
9
- **Develop (unreleased, post-v0.17.0):** *(empty — develop is the staging branch for the next release).*
9
+ **Develop (unreleased, post-v0.22.0):** *(empty — develop is the staging branch for the next release).*
10
10
 
11
11
  ## Milestone history
12
12
 
@@ -63,6 +63,11 @@
63
63
  | `gflow image upscale <mediaId> --scale 2k\|4k` — credit-free download-menu upscale, 4K Ultra-gated (#171) | ✅ done (v0.16.0) |
64
64
  | Cookie-store session verification fast path (`verify_flow_profile`, PR #168) + Playwright fallback | ✅ done (v0.17.0) |
65
65
  | Entity-attach exit-7 remediation hint + `entity_attach_context` drift telemetry (#174 interim) | ✅ done (v0.17.0) |
66
+ | Agentic-UI exit-23 `UiSelectorDriftError` + `out_dir` wiring (#183) | ✅ done (v0.18.0) |
67
+ | Patchright opt-in browser engine (`GFLOW_CLI_BROWSER_ENGINE=patchright`) | ✅ done (v0.19.0) |
68
+ | Aspect-ratio overrides under Agentic & Classic cohorts + `GFLOW_CLI_PREFER_CLASSIC` (#193) | ✅ done (v0.20.0 / v0.20.1) |
69
+ | MCP server (`gflow mcp run` stdio + `gflow serve` HTTP/SSE) + daemon/queue scaffolding | ✅ done (v0.21.0) |
70
+ | Tools framework: `gflow tools` group + `--tool` + `creative-director` + "My Tools" + MCP parity | ✅ done (v0.22.0) |
66
71
  | `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
67
72
  | Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
68
73
  | Provider abstraction for official Veo 3.1 API | ⏳ planned |