gflow-cli 0.20.1__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 (500) hide show
  1. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/pr-council-review.md +6 -0
  2. {gflow_cli-0.20.1 → 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.20.1 → gflow_cli-0.22.0}/.env.template +11 -0
  5. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/ci.yml +17 -3
  6. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/governance-advisory.yml +1 -1
  7. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/governance-benchmark.yml +1 -1
  8. gflow_cli-0.22.0/.github/workflows/main-base-guard.yml +50 -0
  9. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/release.yml +1 -1
  10. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.gitignore +13 -6
  11. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/AGENTS.md +3 -1
  12. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CHANGELOG.md +66 -1
  13. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CONFIGURATION.md +2 -0
  14. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CONTRIBUTING.md +17 -0
  15. gflow_cli-0.22.0/GEMINI.md +31 -0
  16. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/PKG-INFO +44 -40
  17. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/PLAN.md +22 -1
  18. gflow_cli-0.22.0/README.md +144 -0
  19. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/ROADMAP.md +7 -6
  20. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/CONFIGURATION.md +25 -2
  21. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/INDEX.md +7 -1
  22. gflow_cli-0.22.0/docs/LIVE_VERIFICATION_v0.21.0.md +66 -0
  23. gflow_cli-0.22.0/docs/LIVE_VERIFICATION_v0.22.0.md +86 -0
  24. gflow_cli-0.22.0/docs/MCP.md +173 -0
  25. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/PROJECT_STATUS.md +7 -2
  26. gflow_cli-0.22.0/docs/PROMPT_EXPANSION.md +247 -0
  27. gflow_cli-0.22.0/docs/TOOLS.md +301 -0
  28. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/USAGE.md +65 -1
  29. gflow_cli-0.22.0/docs/assets/example-run.gif +0 -0
  30. gflow_cli-0.22.0/docs/assets/examples.webp +0 -0
  31. gflow_cli-0.22.0/docs/medium_tutorial.md +80 -0
  32. gflow_cli-0.22.0/docs/sonar-cleanup-tracker.md +81 -0
  33. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +177 -0
  34. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +69 -0
  35. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +67 -0
  36. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +146 -0
  37. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +56 -0
  38. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +60 -0
  39. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +117 -0
  40. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +110 -0
  41. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +66 -0
  42. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +233 -0
  43. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +94 -0
  44. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +78 -0
  45. gflow_cli-0.22.0/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +571 -0
  46. gflow_cli-0.22.0/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +141 -0
  47. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/pyproject.toml +8 -3
  48. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/__init__.py +1 -1
  49. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/_cli_helpers.py +104 -1
  50. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/character.py +52 -49
  51. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/client.py +88 -42
  52. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/image.py +8 -0
  53. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/agentic.py +11 -6
  54. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/classic.py +4 -4
  55. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/factory.py +3 -1
  56. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/ui_automation.py +87 -59
  57. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/ui_automation_video.py +298 -212
  58. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/video.py +33 -16
  59. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/browser_manager.py +14 -0
  60. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/chain.py +96 -51
  61. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/chain_manifest.py +38 -32
  62. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli.py +134 -20
  63. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_image.py +185 -86
  64. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_movie.py +156 -100
  65. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_scene.py +1 -1
  66. gflow_cli-0.22.0/src/gflow_cli/cli_tools.py +88 -0
  67. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_video.py +331 -152
  68. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/composition.py +101 -62
  69. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/config.py +32 -2
  70. gflow_cli-0.22.0/src/gflow_cli/data/migrations/0007_queue.sql +14 -0
  71. gflow_cli-0.22.0/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +6 -0
  72. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/models.py +3 -0
  73. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/recorder.py +226 -102
  74. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/repository.py +5 -3
  75. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/errors.py +8 -0
  76. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/image_batch.py +13 -1
  77. gflow_cli-0.22.0/src/gflow_cli/mcp/__init__.py +12 -0
  78. gflow_cli-0.22.0/src/gflow_cli/mcp/prompts.py +85 -0
  79. gflow_cli-0.22.0/src/gflow_cli/mcp/resources.py +94 -0
  80. gflow_cli-0.22.0/src/gflow_cli/mcp/server.py +160 -0
  81. gflow_cli-0.22.0/src/gflow_cli/mcp/tools.py +340 -0
  82. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/movie_manifest.py +226 -139
  83. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/paths.py +5 -0
  84. gflow_cli-0.22.0/src/gflow_cli/tools/banned.py +81 -0
  85. gflow_cli-0.22.0/src/gflow_cli/tools/builtin/creative-director.toml +229 -0
  86. gflow_cli-0.22.0/src/gflow_cli/tools/expander.py +303 -0
  87. gflow_cli-0.22.0/src/gflow_cli/tools/invocation.py +87 -0
  88. gflow_cli-0.22.0/src/gflow_cli/tools/loader.py +64 -0
  89. gflow_cli-0.22.0/src/gflow_cli/tools/registry.py +52 -0
  90. gflow_cli-0.22.0/src/gflow_cli/tools/runtime.py +63 -0
  91. gflow_cli-0.22.0/src/gflow_cli/tools/spec.py +78 -0
  92. gflow_cli-0.22.0/src/gflow_cli/ui/app.py +151 -0
  93. gflow_cli-0.22.0/src/gflow_cli/ui/server.py +16 -0
  94. gflow_cli-0.22.0/src/gflow_cli/worker/daemon.py +254 -0
  95. gflow_cli-0.22.0/src/gflow_cli/worker/queue.py +179 -0
  96. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image.py +51 -0
  97. gflow_cli-0.22.0/tests/cli/test_cli_tools.py +46 -0
  98. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_video.py +114 -0
  99. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_helpers.py +147 -0
  100. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_t2i_multi_prompt.py +47 -0
  101. gflow_cli-0.22.0/tests/data/test_recorder.py +488 -0
  102. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_store_migrations.py +10 -1
  103. gflow_cli-0.22.0/tests/e2e/test_daemon_e2e.py +143 -0
  104. gflow_cli-0.22.0/tests/e2e/test_tools_e2e.py +201 -0
  105. gflow_cli-0.22.0/tests/mcp/__init__.py +1 -0
  106. gflow_cli-0.22.0/tests/mcp/conftest.py +15 -0
  107. gflow_cli-0.22.0/tests/mcp/test_server.py +511 -0
  108. gflow_cli-0.22.0/tests/mcp/test_stdio_transport.py +106 -0
  109. gflow_cli-0.22.0/tests/services/__init__.py +0 -0
  110. gflow_cli-0.22.0/tests/smoke/__init__.py +0 -0
  111. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_config.py +30 -0
  112. gflow_cli-0.22.0/tests/tools/__init__.py +0 -0
  113. gflow_cli-0.22.0/tests/tools/test_banned.py +58 -0
  114. gflow_cli-0.22.0/tests/tools/test_expander.py +295 -0
  115. gflow_cli-0.22.0/tests/tools/test_invocation.py +88 -0
  116. gflow_cli-0.22.0/tests/tools/test_loader.py +52 -0
  117. gflow_cli-0.22.0/tests/tools/test_registry.py +77 -0
  118. gflow_cli-0.22.0/tests/tools/test_runtime.py +64 -0
  119. gflow_cli-0.22.0/tests/tools/test_spec.py +97 -0
  120. gflow_cli-0.22.0/tests/ui/test_app.py +137 -0
  121. gflow_cli-0.22.0/tests/worker/test_daemon.py +284 -0
  122. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/uv.lock +463 -82
  123. gflow_cli-0.20.1/GEMINI.md +0 -28
  124. gflow_cli-0.20.1/README.md +0 -144
  125. gflow_cli-0.20.1/docs/assets/example-run.gif +0 -0
  126. gflow_cli-0.20.1/scripts/dev/record_flow_capture.py +0 -271
  127. gflow_cli-0.20.1/tests/data/test_recorder.py +0 -214
  128. gflow_cli-0.20.1/tests/dev/test_record_flow_capture.py +0 -88
  129. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/README.md +0 -0
  130. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/active.md +0 -0
  131. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/branch-review.md +0 -0
  132. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/changelog.md +0 -0
  133. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/check.md +0 -0
  134. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/doc-review.md +0 -0
  135. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/known-issues.md +0 -0
  136. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/next.md +0 -0
  137. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/plan.md +0 -0
  138. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/predict.md +0 -0
  139. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/scenario.md +0 -0
  140. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/status.md +0 -0
  141. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.gitattributes +0 -0
  142. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/CODEOWNERS +0 -0
  143. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  144. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/copilot-instructions.md +0 -0
  145. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/dependabot.yml +0 -0
  146. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/external-pr-triage.yml +0 -0
  147. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.gitleaks.toml +0 -0
  148. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.pre-commit-config.yaml +0 -0
  149. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.secrets.baseline +0 -0
  150. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CLAUDE.md +0 -0
  151. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/DISCLAIMER.md +0 -0
  152. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/KNOWN_ISSUES.md +0 -0
  153. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/LICENSE +0 -0
  154. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/RELEASE.md +0 -0
  155. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/conftest.py +0 -0
  156. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docker-compose.yml +0 -0
  157. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AGENT_GUIDE.md +0 -0
  158. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AGENT_UI_E2E.md +0 -0
  159. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AGENT_UI_RECON.md +0 -0
  160. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/ARCHITECTURE.md +0 -0
  161. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AUTHENTICATION.md +0 -0
  162. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/CHARACTER.md +0 -0
  163. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/CHARACTER_RECON.md +0 -0
  164. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DATA_LAYER.md +0 -0
  165. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DEBUGGING.md +0 -0
  166. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DEMOS.md +0 -0
  167. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DEVELOPMENT.md +0 -0
  168. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/E2E_TESTING.md +0 -0
  169. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/EXTERNAL_STORAGE.md +0 -0
  170. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/GITHUB.md +0 -0
  171. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  172. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  173. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  174. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  175. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  176. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  177. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  178. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  179. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  180. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  181. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  182. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  183. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  184. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  185. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  186. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  187. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  188. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  189. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  190. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/MOVIE.md +0 -0
  191. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/SECURITY.md +0 -0
  192. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/USER_GUIDE.md +0 -0
  193. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/assets/demo-split-pf.gif +0 -0
  194. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/schemas/movie-handoff.schema.json +0 -0
  195. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  196. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/README.md +0 -0
  197. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/batch_from_config.py +0 -0
  198. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/multi_prompt_t2i.py +0 -0
  199. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/sample_config.json +0 -0
  200. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/sample_prompts.txt +0 -0
  201. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/single_image_t2i.py +0 -0
  202. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/workflow_chain.py +0 -0
  203. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/llms.txt +0 -0
  204. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/README.md +0 -0
  205. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/01_upload_image.json +0 -0
  206. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  207. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  208. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/04_archive_workflow.json +0 -0
  209. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/05_createProject.json +0 -0
  210. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/06_batchGenerateImages.json +0 -0
  211. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  212. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  213. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  214. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  215. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  216. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/12_create_scene.json +0 -0
  217. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  218. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/14_get_scene_workflows.json +0 -0
  219. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  220. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/ci/check_doc_links.py +0 -0
  221. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/ci/check_materiality.py +0 -0
  222. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/ci/check_repo_hygiene.py +0 -0
  223. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/debug_editor.py +0 -0
  224. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/debug_gen_settings.py +0 -0
  225. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/debug_settings.py +0 -0
  226. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/_recording_client.py +0 -0
  227. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/_spike_common.py +0 -0
  228. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/active_plan.py +0 -0
  229. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  230. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  231. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  232. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  233. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  234. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  235. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_locale_invariants.py +0 -0
  236. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  237. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/character_create_spike.py +0 -0
  238. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/character_create_spike_v2.py +0 -0
  239. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/dump_character_selectors.js +0 -0
  240. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/make_project.py +0 -0
  241. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/materiality_backtest.py +0 -0
  242. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/monitor_pr_38.py +0 -0
  243. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/patch_character.py +0 -0
  244. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/skillopt/README.md +0 -0
  245. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/skillopt/harness.py +0 -0
  246. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/skillopt/tasks.json +0 -0
  247. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  248. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  249. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  250. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  251. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  252. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  253. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  254. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  255. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  256. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  257. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  258. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  259. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  260. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_patch_entity.py +0 -0
  261. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_patchright.py +0 -0
  262. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/README.md +0 -0
  263. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/capture_flow_traffic.py +0 -0
  264. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/memory_profile.py +0 -0
  265. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/recaptcha_mint.py +0 -0
  266. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  267. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  268. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/record_demo.ps1 +0 -0
  269. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_image.py +0 -0
  270. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_real_chrome_image.py +0 -0
  271. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_video_editor.py +0 -0
  272. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_worker_style.py +0 -0
  273. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/verify_chrome_auth_viability.py +0 -0
  274. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/README.md +0 -0
  275. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/gflow-cli/SKILL.md +0 -0
  276. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/plan/SKILL.md +0 -0
  277. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/pr-council-review/SKILL.md +0 -0
  278. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/predict/SKILL.md +0 -0
  279. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/scenario/SKILL.md +0 -0
  280. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/status/SKILL.md +0 -0
  281. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/sonar-project.properties +0 -0
  282. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/__main__.py +0 -0
  283. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/__init__.py +0 -0
  284. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/_engine.py +0 -0
  285. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/_retry.py +0 -0
  286. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  287. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/dto.py +0 -0
  288. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/image_upscale.py +0 -0
  289. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/recaptcha.py +0 -0
  290. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/routes.py +0 -0
  291. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/scene.py +0 -0
  292. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  293. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/_common.py +0 -0
  294. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  295. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/base.py +0 -0
  296. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  297. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  298. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  299. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  300. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  301. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  302. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/__init__.py +0 -0
  303. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/base.py +0 -0
  304. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/cookies.py +0 -0
  305. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/factory.py +0 -0
  306. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  307. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  308. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/strategies.py +0 -0
  309. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/verification.py +0 -0
  310. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_character.py +0 -0
  311. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_data.py +0 -0
  312. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_models.py +0 -0
  313. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_run.py +0 -0
  314. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/__init__.py +0 -0
  315. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/chain_repo.py +0 -0
  316. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  317. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  318. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  319. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  320. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  321. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  322. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  323. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/queries.py +0 -0
  324. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/redaction.py +0 -0
  325. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/store.py +0 -0
  326. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/exceptions.py +0 -0
  327. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/json_output.py +0 -0
  328. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/manifest.py +0 -0
  329. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/media.py +0 -0
  330. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/observability.py +0 -0
  331. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/profile_store.py +0 -0
  332. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/services/__init__.py +0 -0
  333. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/services/character_create.py +0 -0
  334. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/storage.py +0 -0
  335. {gflow_cli-0.20.1/tests → gflow_cli-0.22.0/src/gflow_cli/tools}/__init__.py +0 -0
  336. {gflow_cli-0.20.1/tests/api → gflow_cli-0.22.0/src/gflow_cli/tools/builtin}/__init__.py +0 -0
  337. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tasks/lessons.md +0 -0
  338. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/test_assets/sample_batch.json +0 -0
  339. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/test_assets/sample_batch.tsv +0 -0
  340. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/test_assets/sample_batch_invalid.tsv +0 -0
  341. {gflow_cli-0.20.1/tests/api/transports → gflow_cli-0.22.0/tests}/__init__.py +0 -0
  342. {gflow_cli-0.20.1/tests/api/transports/drivers → gflow_cli-0.22.0/tests/api}/__init__.py +0 -0
  343. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/fixtures/character_gen_response.json +0 -0
  344. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  345. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  346. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  347. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_bearer_redaction.py +0 -0
  348. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_character.py +0 -0
  349. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client.py +0 -0
  350. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_character.py +0 -0
  351. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_delete_characters.py +0 -0
  352. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_generate_character.py +0 -0
  353. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_image.py +0 -0
  354. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_launch_kwargs.py +0 -0
  355. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_patch_entity.py +0 -0
  356. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_scene.py +0 -0
  357. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_upscale.py +0 -0
  358. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_concurrency.py +0 -0
  359. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_dto.py +0 -0
  360. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_engine.py +0 -0
  361. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_image.py +0 -0
  362. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_image_dto.py +0 -0
  363. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_image_upscale.py +0 -0
  364. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  365. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_recaptcha.py +0 -0
  366. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_retry.py +0 -0
  367. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_routes.py +0 -0
  368. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_routes_character.py +0 -0
  369. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_routes_scene.py +0 -0
  370. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_sapisidhash_helper.py +0 -0
  371. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_scene_models.py +0 -0
  372. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_video.py +0 -0
  373. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_video_request.py +0 -0
  374. {gflow_cli-0.20.1/tests/cli → gflow_cli-0.22.0/tests/api/transports}/__init__.py +0 -0
  375. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/conftest.py +0 -0
  376. {gflow_cli-0.20.1/tests/data → gflow_cli-0.22.0/tests/api/transports/drivers}/__init__.py +0 -0
  377. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  378. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/drivers/test_factory.py +0 -0
  379. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_base.py +0 -0
  380. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_bearer.py +0 -0
  381. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_common.py +0 -0
  382. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  383. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_factory.py +0 -0
  384. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_fingerprint.py +0 -0
  385. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_sapisidhash.py +0 -0
  386. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_transport_timeout.py +0 -0
  387. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation.py +0 -0
  388. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  389. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  390. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  391. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  392. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/auth/strategies/test_factory.py +0 -0
  393. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/auth/strategies/test_strategies.py +0 -0
  394. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/auth/test_verification.py +0 -0
  395. {gflow_cli-0.20.1/tests/e2e → gflow_cli-0.22.0/tests/cli}/__init__.py +0 -0
  396. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_auth_list.py +0 -0
  397. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_character.py +0 -0
  398. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_character_create.py +0 -0
  399. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_data.py +0 -0
  400. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  401. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  402. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image_upscale.py +0 -0
  403. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_models.py +0 -0
  404. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_movie.py +0 -0
  405. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_run.py +0 -0
  406. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_scene.py +0 -0
  407. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_video_chain.py +0 -0
  408. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_error_handling.py +0 -0
  409. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_movie_manifest.py +0 -0
  410. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_settings_validation.py +0 -0
  411. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/composition/test_character.py +0 -0
  412. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/composition/test_compose_prompt.py +0 -0
  413. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/composition/test_handoff.py +0 -0
  414. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/conftest.py +0 -0
  415. {gflow_cli-0.20.1/tests/features → gflow_cli-0.22.0/tests/data}/__init__.py +0 -0
  416. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_chain_repo.py +0 -0
  417. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_find_incomplete_character.py +0 -0
  418. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_models.py +0 -0
  419. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_packaging.py +0 -0
  420. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_recorder_character.py +0 -0
  421. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_redaction.py +0 -0
  422. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_repository.py +0 -0
  423. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_scene_persistence.py +0 -0
  424. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_settings_and_errors.py +0 -0
  425. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/dev/test_recording_client.py +0 -0
  426. {gflow_cli-0.20.1/tests/fixtures → gflow_cli-0.22.0/tests/e2e}/__init__.py +0 -0
  427. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/conftest.py +0 -0
  428. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  429. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  430. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_chain_e2e.py +0 -0
  431. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_character_create_e2e.py +0 -0
  432. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  433. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  434. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  435. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  436. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_json_output_e2e.py +0 -0
  437. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  438. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_scene_compose_live.py +0 -0
  439. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_transports_e2e.py +0 -0
  440. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  441. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  442. {gflow_cli-0.20.1/tests/image_batch → gflow_cli-0.22.0/tests/features}/__init__.py +0 -0
  443. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/auth.feature +0 -0
  444. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/auth_login.feature +0 -0
  445. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/character_create.feature +0 -0
  446. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/character_read.feature +0 -0
  447. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/conftest.py +0 -0
  448. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/image.feature +0 -0
  449. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/image_upscale.feature +0 -0
  450. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/locale_picker_include.feature +0 -0
  451. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_auth_login_steps.py +0 -0
  452. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_auth_steps.py +0 -0
  453. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_character_create_steps.py +0 -0
  454. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_character_read_steps.py +0 -0
  455. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_image_steps.py +0 -0
  456. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_image_upscale_steps.py +0 -0
  457. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  458. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_step_collision_guard.py +0 -0
  459. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  460. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_video_chain_steps.py +0 -0
  461. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/video_agent_ui.feature +0 -0
  462. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/video_chain.feature +0 -0
  463. {gflow_cli-0.20.1/tests/integration → gflow_cli-0.22.0/tests/fixtures}/__init__.py +0 -0
  464. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/fixtures/seeded_catalog.py +0 -0
  465. {gflow_cli-0.20.1/tests/services → gflow_cli-0.22.0/tests/image_batch}/__init__.py +0 -0
  466. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/image_batch/test_image_manifest.py +0 -0
  467. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/image_batch/test_observability_events.py +0 -0
  468. {gflow_cli-0.20.1/tests/smoke → gflow_cli-0.22.0/tests/integration}/__init__.py +0 -0
  469. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/conftest.py +0 -0
  470. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/constants.py +0 -0
  471. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/test_storage_gcs.py +0 -0
  472. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/test_storage_s3.py +0 -0
  473. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  474. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  475. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_check_materiality.py +0 -0
  476. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  477. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_materiality_backtest.py +0 -0
  478. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/services/test_character_create_redaction.py +0 -0
  479. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/services/test_character_create_saga.py +0 -0
  480. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  481. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  482. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/smoke/test_real_flow.py +0 -0
  483. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_auth.py +0 -0
  484. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_browser_manager.py +0 -0
  485. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_chain.py +0 -0
  486. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_chain_manifest.py +0 -0
  487. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_cli_data.py +0 -0
  488. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_conftest_isolation.py +0 -0
  489. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_data_queries.py +0 -0
  490. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_documentation_gate.py +0 -0
  491. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_errors.py +0 -0
  492. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_errors_403.py +0 -0
  493. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_json_output.py +0 -0
  494. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_manifest.py +0 -0
  495. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_marker_registry.py +0 -0
  496. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_media.py +0 -0
  497. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_observability.py +0 -0
  498. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_paths.py +0 -0
  499. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_profile_store.py +0 -0
  500. {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_smoke.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]].
@@ -129,3 +129,14 @@
129
129
  # scripts/dev/capture_locale_invariants.py or to live-verify a non-EN
130
130
  # language end-to-end (see KNOWN_ISSUES § issue #24).
131
131
  # GFLOW_CLI_LOCALE=en-US
132
+
133
+ # -----------------------------------------------------------------------------
134
+ # Headless Daemon (gflow serve)
135
+ # -----------------------------------------------------------------------------
136
+
137
+ # API Token header for gflow serve authentication (required when binding to non-local interface, e.g. 0.0.0.0).
138
+ # GFLOW_DAEMON_TOKEN=
139
+
140
+ # Port for gflow serve. Default is 8000.
141
+ # GFLOW_DAEMON_PORT=8000
142
+
@@ -16,7 +16,7 @@ jobs:
16
16
  name: Secret scan (gitleaks)
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v6
19
+ - uses: actions/checkout@v7
20
20
  with:
21
21
  fetch-depth: 0 # full history so gitleaks can diff against base
22
22
 
@@ -25,6 +25,20 @@ jobs:
25
25
  env:
26
26
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27
27
 
28
+ # ── Security gate: dependency CVE audit against locked deps ──────────────
29
+ deps-audit:
30
+ name: Dependency audit (pip-audit)
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@v7
34
+ - name: Install uv
35
+ uses: astral-sh/setup-uv@v7
36
+ - name: Audit locked dependencies for known CVEs
37
+ # Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
38
+ run: |
39
+ uv export --frozen --format requirements-txt --no-emit-project > requirements-audit.txt
40
+ uvx pip-audit -r requirements-audit.txt
41
+
28
42
  # ── Main test matrix ──────────────────────────────────────────────────────
29
43
  test:
30
44
  runs-on: ubuntu-latest
@@ -32,7 +46,7 @@ jobs:
32
46
  matrix:
33
47
  python-version: ["3.11", "3.12", "3.13"]
34
48
  steps:
35
- - uses: actions/checkout@v6
49
+ - uses: actions/checkout@v7
36
50
 
37
51
  - name: Install uv
38
52
  uses: astral-sh/setup-uv@v7
@@ -88,7 +102,7 @@ jobs:
88
102
  github.event.pull_request.head.repo.full_name == github.repository
89
103
  )
90
104
  steps:
91
- - uses: actions/checkout@v6
105
+ - uses: actions/checkout@v7
92
106
  with:
93
107
  fetch-depth: 0 # shallow clones break blame / new-code detection
94
108
 
@@ -19,7 +19,7 @@ jobs:
19
19
  name: Materiality + traceability (advisory)
20
20
  runs-on: ubuntu-latest
21
21
  steps:
22
- - uses: actions/checkout@v6
22
+ - uses: actions/checkout@v7
23
23
  with:
24
24
  fetch-depth: 0 # full history so `git diff origin/<base>..HEAD` resolves
25
25
 
@@ -18,7 +18,7 @@ jobs:
18
18
  name: Materiality gate backtest
19
19
  runs-on: ubuntu-latest
20
20
  steps:
21
- - uses: actions/checkout@v6
21
+ - uses: actions/checkout@v7
22
22
  with:
23
23
  fetch-depth: 0 # full history — the backtest replays every commit
24
24
 
@@ -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
@@ -19,7 +19,7 @@ jobs:
19
19
  ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
20
20
  NODE_VERSION: '22'
21
21
  steps:
22
- - uses: actions/checkout@v6
22
+ - uses: actions/checkout@v7
23
23
  with:
24
24
  fetch-depth: 0
25
25
 
@@ -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
 
@@ -92,3 +95,7 @@ worktrees/
92
95
 
93
96
  # Understand Anything (local knowledge graph)
94
97
  .understand-anything/
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
@@ -58,6 +59,7 @@ Or invoke the wrapper: `/gflow:check`.
58
59
  - Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
59
60
  - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
60
61
  - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
62
+ - **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_server.py`.
61
63
 
62
64
  ## PR instructions
63
65
 
@@ -80,7 +82,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
80
82
  | `status` | [`skills/status/SKILL.md`](skills/status/SKILL.md) | Show current plan state, progress, and next unchecked task |
81
83
  | `pr-council-review` | [`skills/pr-council-review/SKILL.md`](skills/pr-council-review/SKILL.md) | Multi-dimensional PR council review |
82
84
 
83
- **Cursor / Aider / Codex / Gemini CLI:** paste or include the relevant `SKILL.md` in your system context.
85
+ **Cursor / Aider / Codex / Gemini CLI (`agy`):** paste or include the relevant `SKILL.md` in your system context. Note: in the `agy` TUI prompt, custom slash commands (e.g. `/gflow:pr-council-review`) are blocked by the TUI's command parser. Type them as plain text without the leading slash (e.g. `gflow:pr-council-review`, `gflow:branch-review`, or `gflow:check`) to trigger the corresponding agent skill workflow.
84
86
  **Claude Code:** the `/gflow:` slash commands in `.claude/commands/gflow/` are auto-discovered when the project is open — no extra setup needed. To register a skill globally, copy the command file to `~/.claude/commands/`.
85
87
  **Custom agents:** fetch `skills/gflow-cli/SKILL.md` into your knowledge base before answering gflow questions.
86
88
 
@@ -7,6 +7,69 @@ 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
+
56
+ ## [0.21.0] — 2026-06-26
57
+
58
+ ### Added
59
+
60
+ - **MCP server** (`gflow mcp run`): a [Model Context Protocol](https://modelcontextprotocol.io) server over **stdio** that exposes gflow's image / video / data operations to MCP-aware agents (Claude Desktop, Cursor, VS Code) as JSON-RPC **tools, resources, and prompts**. Point the client at `gflow mcp run` (example config in `gflow mcp run --help` and [docs/MCP.md](docs/MCP.md)). `gflow mcp setup --target <claude-desktop|cursor|vscode>` is scaffolded for future auto-configuration.
61
+ - **MCP over HTTP/SSE** (`gflow serve`): serves the same MCP server over Server-Sent Events — stream at `/sse`, POST messages to `/messages/`. Binds `127.0.0.1:8000` by default; non-loopback binds require `GFLOW_DAEMON_TOKEN`. Foundation for the forthcoming Gflow Studio Web UI and REST `/api/v1` surface.
62
+ - **Daemon & generation-queue scaffolding** (internal foundation): a FastAPI lifespan daemon, a `FlowWorker` background processor, and a SQLite-backed generation queue (`QueueRepository` + migration `0007_queue`, swept to `failed` on restart). Lays the groundwork for queued asynchronous generation; not yet wired into a user command (`gflow serve` currently runs the MCP/SSE server only).
63
+
64
+ ### Fixed
65
+
66
+ - **Security — `cryptography` advisory** ([GHSA-537c-gmf6-5ccf](https://github.com/advisories/GHSA-537c-gmf6-5ccf)): bumped the locked `cryptography` from 48.0.0 to 49.0.0 (transitive dependency).
67
+
68
+ ### Changed
69
+
70
+ - **CI — dependency CVE gate**: added a `pip-audit` job that audits the locked dependency set on every PR and fails on known advisories.
71
+ - **Code health**: SonarCloud cleanup sweep across the CLI, API, transport drivers, and movie/manifest layers (cognitive-complexity, duplicate-literal, and unused-argument refactors) with no behavioral change.
72
+
10
73
  ## [0.20.1] — 2026-06-16
11
74
 
12
75
  ### Fixed
@@ -1565,7 +1628,9 @@ shell-script template that branches on these codes.
1565
1628
 
1566
1629
  First skeleton. Not functional end-to-end yet.
1567
1630
 
1568
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...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
1633
+ [0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
1569
1634
  [0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
1570
1635
  [0.20.0]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...v0.20.0
1571
1636
  [0.19.0]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...v0.19.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
@@ -0,0 +1,31 @@
1
+ # GEMINI.md
2
+
3
+ > Project memory hub for **Gemini CLI**. The universal coding-agent rules for any tool (Cursor, Codex, Aider, Gemini CLI, etc.) live in [AGENTS.md](AGENTS.md) — this file carries Gemini-specific session protocol only.
4
+
5
+ ## What this project is
6
+
7
+ `gflow-cli` is an unofficial Python CLI that drives [Google Flow](https://labs.google/fx/tools/flow) (Veo image-to-video, Imagen text-to-image) from the terminal by reverse-engineering Flow's private REST API. See [README.md](README.md) for the user-facing overview.
8
+
9
+ ## On every session start
10
+
11
+ 1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
12
+ 2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
13
+ 3. Pull deeper context on demand (type as plain text in the `agy` TUI prompt):
14
+ - Current task / where we left off → `gflow:status`
15
+ - Starting a new feature → `gflow:predict` → `gflow:scenario` → `gflow:plan <feature>`
16
+ - Touching auth or reCAPTCHA → `gflow:known-issues`
17
+ - Cutting a release → `gflow:release`
18
+ - Before any commit → `gflow:check`
19
+
20
+ ## Gemini-specific
21
+
22
+ - Use specialized skills when relevant (e.g., `find-docs` for library research, `pr-council-review` for PR audits).
23
+ - Maintain memory via the `mcp-mempalace` tool if available.
24
+ - Prioritize **turn efficiency** and **high-signal output**.
25
+
26
+ ## Active phase
27
+
28
+ - **Decoupled Daemon/Worker Plan:** The blueprint for the headless SSE Daemon, SQLite generation queue, and Tauri/React editor is scheduled in [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md) and [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md).
29
+ - **Core Lesson (Retrospective):** Kept `gflow-cli` strictly headless (running Uvicorn and FastMCP over localhost HTTP/SSE). Bypassed browser context locks by serializing task writes in SQLite queue, allowing parallel client database reads via WAL mode.
30
+
31
+ See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.