gflow-cli 0.45.0__tar.gz → 0.46.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 (684) hide show
  1. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.codex-plugin/plugin.json +1 -1
  2. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.env.template +27 -3
  3. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/CHANGELOG.md +54 -1
  4. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/CONFIGURATION.md +3 -2
  5. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/PKG-INFO +1 -1
  6. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/PLAN.md +1 -1
  7. {gflow_cli-0.45.0/website → gflow_cli-0.46.0}/docs/CONFIGURATION.md +95 -25
  8. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/INDEX.md +1 -1
  9. gflow_cli-0.46.0/docs/LIVE_VERIFICATION_v0.46.0.md +135 -0
  10. {gflow_cli-0.45.0/website → gflow_cli-0.46.0}/docs/PROMPT_EXPANSION.md +35 -18
  11. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/SECURITY.md +2 -2
  12. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/TOOLS.md +8 -8
  13. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/USAGE.md +4 -4
  14. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/pyproject.toml +1 -1
  15. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/ci/generate_website_docs.py +31 -6
  16. gflow_cli-0.46.0/scripts/diag/spike_387_openai_compat.py +200 -0
  17. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/check/SKILL.md +8 -3
  18. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/doc-review/SKILL.md +28 -14
  19. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/__init__.py +1 -1
  20. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/_cli_helpers.py +31 -4
  21. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli.py +16 -1
  22. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_video.py +1 -11
  23. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/config.py +114 -6
  24. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/mcp/tools.py +4 -2
  25. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/builtin/creative-director.toml +1 -2
  26. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +1 -2
  27. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/builtin/storyboard.toml +1 -2
  28. gflow_cli-0.46.0/src/gflow_cli/tools/expander.py +491 -0
  29. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/invocation.py +14 -3
  30. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/runtime.py +16 -3
  31. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/spec.py +6 -1
  32. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_tools.py +7 -6
  33. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_tools_e2e.py +38 -15
  34. gflow_cli-0.46.0/tests/integration/test_expander_gateway.py +205 -0
  35. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_generate_website_docs.py +27 -0
  36. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_config.py +116 -0
  37. gflow_cli-0.46.0/tests/tools/test_expander.py +685 -0
  38. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/test_loader.py +1 -1
  39. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/test_runtime.py +4 -4
  40. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/test_spec.py +1 -1
  41. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/uv.lock +1 -1
  42. {gflow_cli-0.45.0 → gflow_cli-0.46.0/website}/docs/CONFIGURATION.md +95 -25
  43. {gflow_cli-0.45.0 → gflow_cli-0.46.0/website}/docs/PROMPT_EXPANSION.md +35 -18
  44. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/SECURITY.md +2 -2
  45. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/TOOLS.md +8 -8
  46. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/USAGE.md +4 -4
  47. gflow_cli-0.45.0/src/gflow_cli/tools/expander.py +0 -365
  48. gflow_cli-0.45.0/tests/tools/test_expander.py +0 -384
  49. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.agents/plugins/marketplace.json +0 -0
  50. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/README.md +0 -0
  51. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/active.md +0 -0
  52. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/branch-review.md +0 -0
  53. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/changelog.md +0 -0
  54. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/check.md +0 -0
  55. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/doc-review.md +0 -0
  56. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  57. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  58. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/known-issues.md +0 -0
  59. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/live-verify.md +0 -0
  60. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/llm-council.md +0 -0
  61. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/next.md +0 -0
  62. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/plan.md +0 -0
  63. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  64. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/predict.md +0 -0
  65. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/release.md +0 -0
  66. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/scenario.md +0 -0
  67. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/sonar.md +0 -0
  68. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.claude/commands/gflow/status.md +0 -0
  69. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.gitattributes +0 -0
  70. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/CODEOWNERS +0 -0
  71. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  72. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/copilot-instructions.md +0 -0
  73. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/dependabot.yml +0 -0
  74. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/ci.yml +0 -0
  75. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/external-pr-triage.yml +0 -0
  76. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/governance-advisory.yml +0 -0
  77. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/governance-benchmark.yml +0 -0
  78. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/main-base-guard.yml +0 -0
  79. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/pages.yml +0 -0
  80. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.github/workflows/release.yml +0 -0
  81. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.gitignore +0 -0
  82. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.gitleaks.toml +0 -0
  83. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.pre-commit-config.yaml +0 -0
  84. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/.secrets.baseline +0 -0
  85. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/AGENTS.md +0 -0
  86. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/CLAUDE.md +0 -0
  87. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/CONTRIBUTING.md +0 -0
  88. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/DISCLAIMER.md +0 -0
  89. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/KNOWN_ISSUES.md +0 -0
  90. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/LICENSE +0 -0
  91. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/README.md +0 -0
  92. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/RELEASE.md +0 -0
  93. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/ROADMAP.md +0 -0
  94. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/conftest.py +0 -0
  95. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
  96. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docker-compose.yml +0 -0
  97. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/AGENT_GUIDE.md +0 -0
  98. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/AGENT_UI_E2E.md +0 -0
  99. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/AGENT_UI_RECON.md +0 -0
  100. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/ARCHITECTURE.md +0 -0
  101. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/ASSET_TAGGING_RECON.md +0 -0
  102. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/AUTHENTICATION.md +0 -0
  103. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/CHARACTER.md +0 -0
  104. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/CHARACTER_RECON.md +0 -0
  105. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/DATA_LAYER.md +0 -0
  106. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/DEBUGGING.md +0 -0
  107. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/DEMOS.md +0 -0
  108. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/DEVELOPMENT.md +0 -0
  109. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/E2E_TESTING.md +0 -0
  110. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/EXTERNAL_STORAGE.md +0 -0
  111. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/GITHUB.md +0 -0
  112. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  113. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  114. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/INSTRUCTIONS.md +0 -0
  115. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  116. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  117. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  118. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  119. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  120. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  121. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  122. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  123. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  124. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  125. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  126. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  127. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  128. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  129. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  130. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  131. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  132. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  133. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  134. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  135. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  136. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
  137. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
  138. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
  139. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
  140. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
  141. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
  142. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
  143. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
  144. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
  145. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
  146. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
  147. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
  148. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
  149. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
  150. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
  151. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
  152. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
  153. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
  154. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
  155. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
  156. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  157. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  158. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  159. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  160. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  161. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/MCP.md +0 -0
  162. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/MOVIE.md +0 -0
  163. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/PROJECT_STATUS.md +0 -0
  164. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/REFERENCE_STRATEGIES.md +0 -0
  165. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/USER_GUIDE.md +0 -0
  166. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/assets/demo-split-pf.gif +0 -0
  167. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/assets/example-run.gif +0 -0
  168. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/assets/examples.webp +0 -0
  169. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/medium_tutorial.md +0 -0
  170. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/schemas/movie-handoff.schema.json +0 -0
  171. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/sonar-cleanup-tracker.md +0 -0
  172. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  173. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  174. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  175. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  176. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  177. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  178. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  179. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  180. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  181. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  182. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
  183. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
  184. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
  185. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
  186. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
  187. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
  188. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
  189. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
  190. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
  191. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
  192. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
  193. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
  194. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
  195. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
  196. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
  197. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  198. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  199. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
  200. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
  201. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
  202. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
  203. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
  204. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
  205. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
  206. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/eval/pr_triage_eval.py +0 -0
  207. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/eval/pr_triage_fixtures.json +0 -0
  208. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/README.md +0 -0
  209. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/batch_from_config.py +0 -0
  210. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/multi_prompt_t2i.py +0 -0
  211. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/sample_config.json +0 -0
  212. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/sample_prompts.txt +0 -0
  213. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/single_image_t2i.py +0 -0
  214. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/examples/workflow_chain.py +0 -0
  215. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/index.html +0 -0
  216. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/llms.txt +0 -0
  217. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/README.md +0 -0
  218. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/01_upload_image.json +0 -0
  219. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  220. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  221. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/04_archive_workflow.json +0 -0
  222. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/05_createProject.json +0 -0
  223. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/06_batchGenerateImages.json +0 -0
  224. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  225. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  226. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  227. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  228. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  229. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/12_create_scene.json +0 -0
  230. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  231. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/14_get_scene_workflows.json +0 -0
  232. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  233. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/autopilot/Dockerfile.triage +0 -0
  234. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/autopilot/entrypoint.sh +0 -0
  235. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
  236. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/autopilot/pr_triage_gate.py +0 -0
  237. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
  238. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/ci/check_doc_links.py +0 -0
  239. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/ci/check_materiality.py +0 -0
  240. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/ci/check_release_artifacts.py +0 -0
  241. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/ci/check_repo_hygiene.py +0 -0
  242. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/ci/check_website_docs_pii.py +0 -0
  243. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/debug_editor.py +0 -0
  244. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/debug_gen_settings.py +0 -0
  245. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/debug_settings.py +0 -0
  246. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/_recording_client.py +0 -0
  247. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/_spike_common.py +0 -0
  248. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/active_plan.py +0 -0
  249. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  250. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  251. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  252. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  253. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  254. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  255. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/capture_locale_invariants.py +0 -0
  256. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  257. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/character_create_spike.py +0 -0
  258. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/character_create_spike_v2.py +0 -0
  259. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/dump_character_selectors.js +0 -0
  260. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/incident_bundle_quality.py +0 -0
  261. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/make_project.py +0 -0
  262. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/materiality_backtest.py +0 -0
  263. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/monitor_pr_38.py +0 -0
  264. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/patch_character.py +0 -0
  265. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/skillopt/README.md +0 -0
  266. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/skillopt/harness.py +0 -0
  267. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/skillopt/tasks.json +0 -0
  268. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/sonar-local-scan.sh +0 -0
  269. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
  270. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  271. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  272. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_character_prompt_format.py +0 -0
  273. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  274. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  275. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  276. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  277. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_incident_live.py +0 -0
  278. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  279. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  280. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
  281. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
  282. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
  283. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
  284. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  285. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  286. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  287. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  288. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  289. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_patch_entity.py +0 -0
  290. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/dev/spike_patchright.py +0 -0
  291. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/diag/README.md +0 -0
  292. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/diag/capture_flow_traffic.py +0 -0
  293. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/diag/memory_profile.py +0 -0
  294. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/diag/recaptcha_mint.py +0 -0
  295. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  296. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  297. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/record_demo.ps1 +0 -0
  298. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/smoke_image.py +0 -0
  299. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/smoke_video_editor.py +0 -0
  300. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/smoke_worker_style.py +0 -0
  301. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/spike_waf_camoufox.py +0 -0
  302. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/scripts/verify_chrome_auth_viability.py +0 -0
  303. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/README.md +0 -0
  304. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/changelog/SKILL.md +0 -0
  305. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/gflow-cli/SKILL.md +0 -0
  306. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/issue-assessment/SKILL.md +0 -0
  307. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/issue-resolve/SKILL.md +0 -0
  308. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/known-issues/SKILL.md +0 -0
  309. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/live-verify/SKILL.md +0 -0
  310. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/llm-council/SKILL.md +0 -0
  311. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/plan/SKILL.md +0 -0
  312. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/pr-council-review/SKILL.md +0 -0
  313. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/predict/SKILL.md +0 -0
  314. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/release/SKILL.md +0 -0
  315. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/scenario/SKILL.md +0 -0
  316. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/sonar/SKILL.md +0 -0
  317. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/skills/status/SKILL.md +0 -0
  318. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/sonar-project.properties +0 -0
  319. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/__main__.py +0 -0
  320. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/__init__.py +0 -0
  321. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/_engine.py +0 -0
  322. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/_retry.py +0 -0
  323. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  324. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/character.py +0 -0
  325. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/client.py +0 -0
  326. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/dto.py +0 -0
  327. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/image.py +0 -0
  328. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/image_upscale.py +0 -0
  329. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/recaptcha.py +0 -0
  330. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/routes.py +0 -0
  331. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/scene.py +0 -0
  332. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  333. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/_common.py +0 -0
  334. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  335. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/base.py +0 -0
  336. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  337. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  338. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  339. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  340. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  341. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  342. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  343. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  344. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  345. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
  346. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
  347. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  348. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/api/video.py +0 -0
  349. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/__init__.py +0 -0
  350. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/base.py +0 -0
  351. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/cookies.py +0 -0
  352. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/factory.py +0 -0
  353. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  354. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  355. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/strategies.py +0 -0
  356. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/auth/verification.py +0 -0
  357. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/browser_manager.py +0 -0
  358. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/chain.py +0 -0
  359. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/chain_manifest.py +0 -0
  360. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_character.py +0 -0
  361. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_data.py +0 -0
  362. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_image.py +0 -0
  363. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_instructions.py +0 -0
  364. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_models.py +0 -0
  365. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_movie.py +0 -0
  366. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_project.py +0 -0
  367. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_run.py +0 -0
  368. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_scene.py +0 -0
  369. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/cli_tools.py +0 -0
  370. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/composition.py +0 -0
  371. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/__init__.py +0 -0
  372. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/chain_repo.py +0 -0
  373. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  374. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  375. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  376. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  377. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  378. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  379. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  380. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  381. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
  382. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  383. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/models.py +0 -0
  384. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/queries.py +0 -0
  385. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/recorder.py +0 -0
  386. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/redaction.py +0 -0
  387. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/repository.py +0 -0
  388. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/data/store.py +0 -0
  389. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/diagnostics.py +0 -0
  390. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/errors.py +0 -0
  391. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/exceptions.py +0 -0
  392. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/image_batch.py +0 -0
  393. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/json_output.py +0 -0
  394. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/mcp/__init__.py +0 -0
  395. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/mcp/prompts.py +0 -0
  396. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/mcp/resources.py +0 -0
  397. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/mcp/server.py +0 -0
  398. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/media.py +0 -0
  399. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/movie_manifest.py +0 -0
  400. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/observability.py +0 -0
  401. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/paths.py +0 -0
  402. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/profile_lease.py +0 -0
  403. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/profile_store.py +0 -0
  404. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/redaction.py +0 -0
  405. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/services/__init__.py +0 -0
  406. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/services/character_create.py +0 -0
  407. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/services/mentions.py +0 -0
  408. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/storage.py +0 -0
  409. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/__init__.py +0 -0
  410. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/banned.py +0 -0
  411. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  412. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/loader.py +0 -0
  413. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/tools/registry.py +0 -0
  414. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/ui/app.py +0 -0
  415. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/ui/server.py +0 -0
  416. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/worker/codec.py +0 -0
  417. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/worker/daemon.py +0 -0
  418. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/src/gflow_cli/worker/queue.py +0 -0
  419. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tasks/lessons.md +0 -0
  420. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/test_assets/sample_batch.json +0 -0
  421. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/test_assets/sample_batch.tsv +0 -0
  422. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/test_assets/sample_batch_invalid.tsv +0 -0
  423. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/__init__.py +0 -0
  424. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/__init__.py +0 -0
  425. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/fixtures/character_gen_response.json +0 -0
  426. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  427. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  428. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  429. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_bearer_redaction.py +0 -0
  430. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_character.py +0 -0
  431. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client.py +0 -0
  432. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_character.py +0 -0
  433. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_delete_characters.py +0 -0
  434. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_errors.py +0 -0
  435. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_generate_character.py +0 -0
  436. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_image.py +0 -0
  437. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_incidents.py +0 -0
  438. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_launch_kwargs.py +0 -0
  439. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_patch_entity.py +0 -0
  440. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_scene.py +0 -0
  441. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_client_upscale.py +0 -0
  442. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_concurrency.py +0 -0
  443. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_dto.py +0 -0
  444. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_engine.py +0 -0
  445. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_image.py +0 -0
  446. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_image_dto.py +0 -0
  447. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_image_upscale.py +0 -0
  448. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  449. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_recaptcha.py +0 -0
  450. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_retry.py +0 -0
  451. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_routes.py +0 -0
  452. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_routes_character.py +0 -0
  453. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_routes_scene.py +0 -0
  454. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_sapisidhash_helper.py +0 -0
  455. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_scene_models.py +0 -0
  456. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_video.py +0 -0
  457. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/test_video_request.py +0 -0
  458. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/__init__.py +0 -0
  459. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/conftest.py +0 -0
  460. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/drivers/__init__.py +0 -0
  461. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  462. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/drivers/test_classic.py +0 -0
  463. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/drivers/test_factory.py +0 -0
  464. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
  465. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
  466. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_base.py +0 -0
  467. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_bearer.py +0 -0
  468. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_common.py +0 -0
  469. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  470. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_factory.py +0 -0
  471. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_fingerprint.py +0 -0
  472. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_mode_control.py +0 -0
  473. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_sapisidhash.py +0 -0
  474. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_selector_symmetry.py +0 -0
  475. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_transport_timeout.py +0 -0
  476. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_ui_automation.py +0 -0
  477. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  478. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  479. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  480. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  481. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/auth/strategies/test_factory.py +0 -0
  482. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/auth/strategies/test_strategies.py +0 -0
  483. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/auth/test_cookies.py +0 -0
  484. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/auth/test_real_chrome.py +0 -0
  485. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/auth/test_verification.py +0 -0
  486. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
  487. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/__init__.py +0 -0
  488. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_auth_list.py +0 -0
  489. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_character.py +0 -0
  490. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_character_create.py +0 -0
  491. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_data.py +0 -0
  492. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_data_errors.py +0 -0
  493. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
  494. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_image.py +0 -0
  495. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  496. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  497. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_image_upscale.py +0 -0
  498. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
  499. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_instructions.py +0 -0
  500. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_models.py +0 -0
  501. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_movie.py +0 -0
  502. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_run.py +0 -0
  503. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_scene.py +0 -0
  504. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_video.py +0 -0
  505. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_cli_video_chain.py +0 -0
  506. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_error_handling.py +0 -0
  507. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_failure_funnel.py +0 -0
  508. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_helpers.py +0 -0
  509. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_incident_output.py +0 -0
  510. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_movie_manifest.py +0 -0
  511. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  512. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_settings_validation.py +0 -0
  513. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  514. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/composition/test_character.py +0 -0
  515. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/composition/test_compose_prompt.py +0 -0
  516. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/composition/test_handoff.py +0 -0
  517. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/composition/test_style_variants.py +0 -0
  518. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/composition/test_style_variants_e2e.py +0 -0
  519. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/conftest.py +0 -0
  520. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/__init__.py +0 -0
  521. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_chain_repo.py +0 -0
  522. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_failure_recording.py +0 -0
  523. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_find_incomplete_character.py +0 -0
  524. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_models.py +0 -0
  525. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_packaging.py +0 -0
  526. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_recorder.py +0 -0
  527. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_recorder_character.py +0 -0
  528. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_redaction.py +0 -0
  529. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_repository.py +0 -0
  530. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_scene_persistence.py +0 -0
  531. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_settings_and_errors.py +0 -0
  532. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/data/test_store_migrations.py +0 -0
  533. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/dev/test_recording_client.py +0 -0
  534. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/__init__.py +0 -0
  535. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/conftest.py +0 -0
  536. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
  537. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  538. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
  539. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  540. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_cancellation_e2e.py +0 -0
  541. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_chain_e2e.py +0 -0
  542. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_character_create_e2e.py +0 -0
  543. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
  544. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_daemon_e2e.py +0 -0
  545. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  546. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
  547. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  548. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  549. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  550. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
  551. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
  552. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_json_output_e2e.py +0 -0
  553. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  554. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  555. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_project_naming_e2e.py +0 -0
  556. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_scene_compose_live.py +0 -0
  557. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_transports_e2e.py +0 -0
  558. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  559. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  560. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/__init__.py +0 -0
  561. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/asset_tagging.feature +0 -0
  562. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/auth.feature +0 -0
  563. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/auth_login.feature +0 -0
  564. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/character_create.feature +0 -0
  565. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/character_read.feature +0 -0
  566. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/conftest.py +0 -0
  567. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/image.feature +0 -0
  568. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/image_upscale.feature +0 -0
  569. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/incident_diagnostics.feature +0 -0
  570. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/instructions.feature +0 -0
  571. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/locale_picker_include.feature +0 -0
  572. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_asset_tagging_steps.py +0 -0
  573. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_auth_login_steps.py +0 -0
  574. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_auth_steps.py +0 -0
  575. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_character_create_steps.py +0 -0
  576. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_character_read_steps.py +0 -0
  577. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_image_steps.py +0 -0
  578. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_image_upscale_steps.py +0 -0
  579. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
  580. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_instructions_steps.py +0 -0
  581. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  582. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_step_collision_guard.py +0 -0
  583. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  584. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/test_video_chain_steps.py +0 -0
  585. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/video_agent_ui.feature +0 -0
  586. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/features/video_chain.feature +0 -0
  587. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/fixtures/__init__.py +0 -0
  588. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/fixtures/seeded_catalog.py +0 -0
  589. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/image_batch/__init__.py +0 -0
  590. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/image_batch/test_image_manifest.py +0 -0
  591. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/image_batch/test_jitter_config.py +0 -0
  592. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/image_batch/test_observability_events.py +0 -0
  593. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/integration/__init__.py +0 -0
  594. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/integration/conftest.py +0 -0
  595. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/integration/constants.py +0 -0
  596. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/integration/test_storage_gcs.py +0 -0
  597. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/integration/test_storage_s3.py +0 -0
  598. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/__init__.py +0 -0
  599. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/conftest.py +0 -0
  600. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/test_cli_parity.py +0 -0
  601. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/test_server.py +0 -0
  602. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/test_stdio_transport.py +0 -0
  603. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/test_tools_helpers.py +0 -0
  604. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/test_tools_instructions.py +0 -0
  605. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/mcp/test_tools_wired.py +0 -0
  606. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  607. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  608. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_check_materiality.py +0 -0
  609. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_check_release_artifacts.py +0 -0
  610. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  611. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
  612. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_codex_plugin.py +0 -0
  613. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
  614. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/scripts/test_materiality_backtest.py +0 -0
  615. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/__init__.py +0 -0
  616. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_character_create_redaction.py +0 -0
  617. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_character_create_saga.py +0 -0
  618. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  619. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_mentions_observability.py +0 -0
  620. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_mentions_parse.py +0 -0
  621. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_mentions_resolve.py +0 -0
  622. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/services/test_resolve_and_apply.py +0 -0
  623. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/smoke/__init__.py +0 -0
  624. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  625. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/smoke/test_real_flow.py +0 -0
  626. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_auth.py +0 -0
  627. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_browser_manager.py +0 -0
  628. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_chain.py +0 -0
  629. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_chain_manifest.py +0 -0
  630. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_cli_data.py +0 -0
  631. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_cli_project.py +0 -0
  632. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_conftest_isolation.py +0 -0
  633. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_data_queries.py +0 -0
  634. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_diagnostics_bundle.py +0 -0
  635. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_diagnostics_events.py +0 -0
  636. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_diagnostics_journal.py +0 -0
  637. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_diagnostics_recorder.py +0 -0
  638. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_diagnostics_retention.py +0 -0
  639. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_diagnostics_sanitize.py +0 -0
  640. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_documentation_gate.py +0 -0
  641. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_errors.py +0 -0
  642. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_errors_classification.py +0 -0
  643. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_json_output.py +0 -0
  644. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_marker_registry.py +0 -0
  645. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_media.py +0 -0
  646. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_observability.py +0 -0
  647. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_overlay_banner_dismissal.py +0 -0
  648. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_paths.py +0 -0
  649. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_profile_lease.py +0 -0
  650. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_profile_lease_subprocess.py +0 -0
  651. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_profile_store.py +0 -0
  652. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_self_documenting_errors.py +0 -0
  653. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/test_smoke.py +0 -0
  654. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/__init__.py +0 -0
  655. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/test_banned.py +0 -0
  656. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/test_invocation.py +0 -0
  657. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/tools/test_registry.py +0 -0
  658. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/ui/test_app.py +0 -0
  659. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/worker/test_codec.py +0 -0
  660. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/worker/test_daemon.py +0 -0
  661. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/worker/test_mcp_daemon_race.py +0 -0
  662. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/worker/test_queue.py +0 -0
  663. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/worker/test_queue_multiprocess.py +0 -0
  664. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/tests/worker/test_queue_reconciliation.py +0 -0
  665. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/ARCHITECTURE.md +0 -0
  666. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/AUTHENTICATION.md +0 -0
  667. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/CHARACTER.md +0 -0
  668. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/DATA_LAYER.md +0 -0
  669. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/DEBUGGING.md +0 -0
  670. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/DEVELOPMENT.md +0 -0
  671. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/E2E_TESTING.md +0 -0
  672. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
  673. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/INSTRUCTIONS.md +0 -0
  674. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/KNOWN_ISSUES.md +0 -0
  675. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/MCP.md +0 -0
  676. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/MOVIE.md +0 -0
  677. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/USER_GUIDE.md +0 -0
  678. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/agents.md +0 -0
  679. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/index.md +0 -0
  680. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/installation.md +0 -0
  681. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/onboarding-mockup.html +0 -0
  682. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/onboarding.md +0 -0
  683. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/docs/stylesheets/extra.css +0 -0
  684. {gflow_cli-0.45.0 → gflow_cli-0.46.0}/website/mkdocs.yml +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gflow",
3
- "version": "0.45.0",
3
+ "version": "0.46.0",
4
4
  "description": "Reusable development and operations workflows for gflow-cli",
5
5
  "author": {
6
6
  "name": "Flavio Oliva",
@@ -56,9 +56,33 @@
56
56
  # official - official Veo SDK (planned for v0.5+, requires Gemini API key)
57
57
  # GFLOW_CLI_PROVIDER=flow
58
58
 
59
- # Gemini API key — only required when GFLOW_CLI_PROVIDER=official.
60
- # Get one at https://aistudio.google.com/apikey
61
- # GFLOW_CLI_GEMINI_API_KEY=
59
+ # -----------------------------------------------------------------------------
60
+ # Prompt tools LLM (--tool creative-director / reverse-engineer / storyboard)
61
+ #
62
+ # Any OpenAI-compatible Chat Completions endpoint: OpenAI, OpenRouter, a
63
+ # corporate gateway, a local proxy, Ollama, or Google's compat endpoint.
64
+ # Provider keys stay with your gateway — gflow only holds the one credential it
65
+ # presents to the endpoint below.
66
+ #
67
+ # NOTE: GFLOW_CLI_GEMINI_API_KEY / GFLOW_CLI_GEMINI_MODEL were REMOVED in
68
+ # v0.46.0 and are not forwarded. Use GFLOW_CLI_LLM_API_KEY — an existing Google
69
+ # AIza… key still works, since the default endpoint is Google's compat surface.
70
+ # -----------------------------------------------------------------------------
71
+
72
+ # Endpoint. This is the on/off switch for the prompt tools.
73
+ # https only, except loopback (127.0.0.1 / localhost / ::1) which may use http.
74
+ # Use 127.0.0.1 rather than localhost — gateways often bind IPv4 only and
75
+ # Windows resolves ::1 first, which stalls.
76
+ # GFLOW_CLI_LLM_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai
77
+
78
+ # Credential for that endpoint (Authorization: Bearer). OPTIONAL — omit it for a
79
+ # keyless local gateway and no header is sent at all.
80
+ # Google key: https://aistudio.google.com/apikey
81
+ # GFLOW_CLI_LLM_API_KEY=
82
+
83
+ # Model, which is also the provider selector since gateways route on it
84
+ # (e.g. openai/gpt-4o-mini). Unset = the gateway chooses.
85
+ # GFLOW_CLI_LLM_MODEL=
62
86
 
63
87
  # -----------------------------------------------------------------------------
64
88
  # Cloud storage
@@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.46.0] — 2026-07-28
11
+
12
+ ### Changed
13
+
14
+ - **BREAKING — the prompt tools now drive any OpenAI-compatible endpoint (#387).**
15
+ `--tool creative-director` / `reverse-engineer` / `storyboard` were hardwired to
16
+ Google's native Gemini API, so an OpenAI-compatible gateway key could not be
17
+ used at all. The transport now speaks **OpenAI Chat Completions**, which
18
+ OpenAI, gateways/proxies (OpenRouter, LiteLLM, freellmapi), local runtimes
19
+ (Ollama, LM Studio) and Google's own compatibility endpoint all accept.
20
+ - New config: `GFLOW_CLI_LLM_BASE_URL` (the on/off switch; defaults to
21
+ Google's compat endpoint), `GFLOW_CLI_LLM_API_KEY` (**optional** — omitted
22
+ from the request entirely when unset, so keyless local gateways work), and
23
+ `GFLOW_CLI_LLM_MODEL` (also the provider selector, since gateways route on
24
+ the model string).
25
+ - Provider keys stay with your gateway. gflow only ever holds the single
26
+ credential it presents to the endpoint you point it at.
27
+ - The three builtin tools no longer pin `model = "gemini-2.5-flash"`. That pin
28
+ was sent unconditionally, so any gateway not serving that exact name
29
+ answered 400 — silently, because the prompt tools never fail a run.
30
+
31
+ ### Removed
32
+
33
+ - **BREAKING — `GFLOW_CLI_GEMINI_API_KEY` and `GFLOW_CLI_GEMINI_MODEL` (#387).**
34
+ Set `GFLOW_CLI_LLM_API_KEY` instead; an existing Google `AIza…` key keeps
35
+ working unchanged, because the default endpoint is Google's OpenAI-compatible
36
+ surface. gflow prints a one-time warning if it sees the old variable — the old
37
+ value is never forwarded. The warning exists because the prompt tools never
38
+ fail a run: without it, prompts would quietly stop being rewritten while
39
+ generations still billed in full.
40
+ `GFLOW_CLI_GEMINI_MODEL` had in fact never had a live code path — its only
41
+ reader was an uncalled helper — despite being documented as a global override.
42
+
43
+ ### Fixed
44
+
45
+ - **`reverse-engineer` no longer expands a file path as if it were a prompt (#387).**
46
+ When multimodal analysis of a URL, video, or image failed, the runtime fell
47
+ through to text expansion of the *path string*, returning a confident but
48
+ useless prompt that still billed a full generation. It now degrades to the
49
+ original input.
50
+
51
+ ### Security
52
+
53
+ - **The prompt-tools endpoint is treated as a trust boundary (#387).** `base_url`
54
+ is user-supplied now, so: redirects are declined (`urllib` re-sends the
55
+ `Authorization` header to whatever host a 302 names, which would have leaked
56
+ the key to a hostile gateway); `base_url` is validated to `https`, or `http`
57
+ for loopback only, with credentials-in-URL rejected; error-response bodies are
58
+ redacted before logging, since a gateway can echo the bearer token back; and
59
+ the resolved destination host is logged once, giving an audit trail for where
60
+ prompts and base64 image bytes were sent.
61
+
10
62
  ## [0.45.0] — 2026-07-28
11
63
 
12
64
  ### Fixed
@@ -2466,7 +2518,8 @@ shell-script template that branches on these codes.
2466
2518
 
2467
2519
  First skeleton. Not functional end-to-end yet.
2468
2520
 
2469
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.45.0...HEAD
2521
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.46.0...HEAD
2522
+ [0.46.0]: https://github.com/ffroliva/gflow-cli/compare/v0.45.0...v0.46.0
2470
2523
  [0.45.0]: https://github.com/ffroliva/gflow-cli/compare/v0.44.0...v0.45.0
2471
2524
  [0.44.0]: https://github.com/ffroliva/gflow-cli/compare/v0.43.0...v0.44.0
2472
2525
  [0.43.0]: https://github.com/ffroliva/gflow-cli/compare/v0.42.0...v0.43.0
@@ -8,8 +8,9 @@
8
8
  | `GFLOW_CLI_OUTPUT_DIR` | `~/Downloads/gflow-cli` | Where generated images and videos are saved. |
9
9
  | `CHROME_BINARY` | (autodetect) | Override Chrome binary path. Falls back to platform-standard locations. |
10
10
  | `GFLOW_CLI_CONCURRENCY` | `4` | Maximum parallel API requests per batch. |
11
- | `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). |
12
- | `GFLOW_CLI_GEMINI_MODEL` | `gemini-2.5-flash` | Gemini model used for prompt expansion. |
11
+ | `GFLOW_CLI_LLM_BASE_URL` | Google compat endpoint | OpenAI-compatible endpoint for the prompt tools (`--tool`). The on/off switch. |
12
+ | `GFLOW_CLI_LLM_API_KEY` | _(unset)_ | Credential for that endpoint. Optional — omit for a keyless local gateway. [Google key](https://aistudio.google.com/apikey). |
13
+ | `GFLOW_CLI_LLM_MODEL` | _(unset)_ | Model, and therefore the provider selector. Unset = the gateway chooses. |
13
14
  | `GFLOW_LIVE` | _(unset)_ | Set to `1` to enable live-API test markers (`@pytest.mark.live`). |
14
15
 
15
16
  ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.45.0
3
+ Version: 0.46.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
@@ -115,7 +115,7 @@ src/gflow_cli/
115
115
 
116
116
  Documented in [docs/CONFIGURATION.md](docs/CONFIGURATION.md) and [.env.template](.env.template). Variables:
117
117
 
118
- `GFLOW_CLI_HOME`, `GFLOW_CLI_OUTPUT_DIR`, `GFLOW_CLI_PROFILE`, `GFLOW_CLI_PROVIDER`, `GFLOW_CLI_GEMINI_API_KEY`, `GFLOW_CLI_TIMEOUT_SECONDS`, `GFLOW_CLI_LOG_LEVEL`, `GFLOW_CLI_LOG_FORMAT`, `GFLOW_CLI_CONCURRENCY`, `GFLOW_CLI_DB_PATH`, `GFLOW_CLI_HISTORY_PROMPTS`.
118
+ `GFLOW_CLI_HOME`, `GFLOW_CLI_OUTPUT_DIR`, `GFLOW_CLI_PROFILE`, `GFLOW_CLI_PROVIDER`, `GFLOW_CLI_LLM_BASE_URL`, `GFLOW_CLI_LLM_API_KEY`, `GFLOW_CLI_LLM_MODEL`, `GFLOW_CLI_TIMEOUT_SECONDS`, `GFLOW_CLI_LOG_LEVEL`, `GFLOW_CLI_LOG_FORMAT`, `GFLOW_CLI_CONCURRENCY`, `GFLOW_CLI_DB_PATH`, `GFLOW_CLI_HISTORY_PROMPTS`.
119
119
 
120
120
  Default paths via `platformdirs`:
121
121
 
@@ -113,27 +113,97 @@ Deep setup, verification, and security notes live in
113
113
  **Default:** `flow`
114
114
  **CLI override:** none yet — set the env var to switch backends once `official` is wired.
115
115
 
116
- ### `GFLOW_CLI_GEMINI_API_KEY`
117
-
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`.
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.
129
- **Get one:** <https://aistudio.google.com/apikey>
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`.
116
+ ### Prompt-tools LLM: `GFLOW_CLI_LLM_*`
117
+
118
+ The prompt tools (`--tool creative-director` / `reverse-engineer` / `storyboard`, see
119
+ [TOOLS.md](TOOLS.md) and [PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)) talk to any endpoint
120
+ speaking the **OpenAI Chat Completions API** — OpenAI, OpenRouter, a corporate gateway, a
121
+ self-hosted proxy, a local Ollama/LM Studio, or Google's own compatibility endpoint.
122
+
123
+ > **Removed in v0.46.0:** `GFLOW_CLI_GEMINI_API_KEY` and `GFLOW_CLI_GEMINI_MODEL` are no
124
+ > longer read and are **not** forwarded. Set `GFLOW_CLI_LLM_API_KEY` instead — an existing
125
+ > Google `AIza…` key keeps working unchanged, because the default endpoint is Google's
126
+ > OpenAI-compatible surface. gflow prints a one-time warning if it sees the old variable,
127
+ > because the prompt tools never fail a run: without the warning your prompts would quietly
128
+ > stop being rewritten while generations still billed in full.
129
+
130
+ #### `GFLOW_CLI_LLM_BASE_URL`
131
+
132
+ **What:** Base URL of an OpenAI-compatible endpoint. This is the on/off switch for the
133
+ prompt tools.
134
+ **Default:** `https://generativelanguage.googleapis.com/v1beta/openai` (Google)
135
+ **Validated:** `https` only — plus plain `http` for loopback (`127.0.0.1`, `localhost`,
136
+ `::1`), since a local gateway never puts your key on the wire. Credentials embedded in the
137
+ URL (`https://user:pass@host`) are rejected; pass the credential via
138
+ `GFLOW_CLI_LLM_API_KEY`. Redirects are never followed, because `urllib` would re-send your
139
+ `Authorization` header to whatever host a redirect names.
140
+
141
+ #### `GFLOW_CLI_LLM_API_KEY`
142
+
143
+ **What:** The credential gflow presents to that endpoint, as `Authorization: Bearer`.
144
+ **Default:** unset — and **optional**. When unset the header is omitted entirely, which is
145
+ what a keyless local gateway expects.
146
+ **Note:** this is the *only* key gflow holds. Provider keys (OpenAI, Anthropic, Google…)
147
+ stay with your gateway; gflow never sees them.
148
+
149
+ #### `GFLOW_CLI_LLM_MODEL`
150
+
151
+ **What:** Model to request. Because gateways route on the model string, this doubles as the
152
+ provider selector (e.g. `openai/gpt-4o-mini`, `google/gemini-2.5-flash`).
153
+ **Default:** unset.
154
+ **Precedence:** a tool's TOML `config.model` pin > `GFLOW_CLI_LLM_MODEL` > the default
155
+ endpoint's own default > omitted, letting the gateway choose. The builtin tools pin
156
+ nothing on purpose: a hardcoded vendor model name is rejected by any gateway that does not
157
+ serve it. Note Google's compat endpoint has **no** server-side default and answers
158
+ `400 "model is not specified"`, so the default endpoint ships a matching default model.
159
+
160
+ #### When is the tool active?
161
+
162
+ Set **either** a key or a base URL and the tools run. Set neither and they are a silent
163
+ no-op: gflow logs an `INFO` notice, makes no network call, and generates from your original
164
+ prompt. It never fails the run — API errors (rate limit, network, a model the gateway does
165
+ not serve) fall back the same way after a short exponential-backoff retry bounded by an
166
+ overall ~60 s wall-clock budget per call. A fallback prints one line to stderr so a
167
+ misconfiguration is not invisible.
168
+
169
+ #### Examples
170
+
171
+ ```bash
172
+ # Google (default endpoint) — an existing AIza… key, nothing else to set
173
+ export GFLOW_CLI_LLM_API_KEY="AIza..."
174
+
175
+ # OpenRouter, or any hosted OpenAI-compatible gateway
176
+ export GFLOW_CLI_LLM_BASE_URL="https://openrouter.ai/api/v1"
177
+ export GFLOW_CLI_LLM_API_KEY="sk-or-..."
178
+ export GFLOW_CLI_LLM_MODEL="google/gemini-2.5-flash"
179
+
180
+ # A local proxy in Docker — one entrypoint across many providers, keys held by
181
+ # the gateway. freellmapi (https://github.com/tashfeenahmed/freellmapi) is one
182
+ # such proxy; anything OpenAI-compatible works.
183
+ export GFLOW_CLI_LLM_BASE_URL="http://127.0.0.1:3001/v1"
184
+ export GFLOW_CLI_LLM_API_KEY="<the gateway's own unified key>"
185
+
186
+ # A keyless local runtime (Ollama) — no credential at all
187
+ export GFLOW_CLI_LLM_BASE_URL="http://127.0.0.1:11434/v1"
188
+ export GFLOW_CLI_LLM_MODEL="llama3"
189
+ ```
190
+
191
+ Verify without spending generation credits:
192
+
193
+ ```bash
194
+ gflow tools run creative-director "cat in space" --json # check "was_expanded": true
195
+ ```
196
+
197
+ #### Gotchas
198
+
199
+ - **Use `127.0.0.1`, not `localhost`.** Gateways commonly bind IPv4 only, and Windows'
200
+ dual-stack resolver tries `::1` first, which stalls until it times out.
201
+ - **Include the version path.** Most gateways serve `/v1`; gflow appends
202
+ `/chat/completions` to whatever you give it.
203
+ - **`HTTP_PROXY` / `HTTPS_PROXY` / `NO_PROXY` apply implicitly.** Python's `urllib` honours
204
+ them, and on Windows it also picks up the system proxy configured in Settings even with
205
+ no env var set. If a corporate proxy is configured, add your local gateway to `NO_PROXY`
206
+ or its traffic will be routed through the proxy and fail non-obviously.
137
207
 
138
208
  ### `GFLOW_CLI_AUTH_LOGIN_TIMEOUT`
139
209
 
@@ -412,12 +482,12 @@ gflow image batch ./manifest.tsv
412
482
  ### "I want to test against the official Veo SDK"
413
483
 
414
484
  ```bash
415
- GFLOW_CLI_PROVIDER=official \
416
- GFLOW_CLI_GEMINI_API_KEY=AIza... \
417
- gflow video t2v "test"
485
+ GFLOW_CLI_PROVIDER=official gflow video t2v "test"
418
486
  ```
419
487
 
420
- (planned v0.5+ — current scaffold accepts but ignores `GFLOW_CLI_PROVIDER=official`.)
488
+ (planned v0.5+ — the current scaffold accepts but ignores `GFLOW_CLI_PROVIDER=official`. It will
489
+ need its own Google credential when implemented; `GFLOW_CLI_LLM_API_KEY` is for the prompt tools
490
+ only and is not used for generation.)
421
491
 
422
492
  ### "I want a sandbox profile that doesn't pollute my main one"
423
493
 
@@ -135,7 +135,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
135
135
  **"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
136
136
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
137
137
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
138
- **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
138
+ **What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.46.0](LIVE_VERIFICATION_v0.46.0.md) (**#387 provider-agnostic prompt-tools transport live-verified 2026-07-28, ZERO credits** — a four-probe capability spike passed 4/4 against BOTH a non-Google gateway and Google's OpenAI-compat endpoint, including a *semantic* multimodal check [a generated solid-red JPEG round-tripped and the model answered 'Red'], which is what proved the native Gemini `inlineData` path could be deleted outright rather than kept as a fallback; the real CLI then returned `was_expanded: true` on gateway/gateway-no-model/Google-default, emitted the loud one-time notice + no-op for the removed `GFLOW_CLI_GEMINI_API_KEY`, and made NO network call when unconfigured. Live verification caught two defects a fully green 2849-test offline suite missed: Google's compat endpoint has no server-side default model [`400 "model is not specified"`, silently no-oping the DEFAULT configuration], and the first redirect guard did not actually work because `build_opener()` installs its default handlers regardless of arguments, so `Authorization` would still have been replayed cross-host. `/code-review high` is recorded as NOT run — it is user-triggered only). Prior: [v0.45.0](LIVE_VERIFICATION_v0.45.0.md) (**#393 UUID `--ref` binding + #395 character-entity binding live-verified 2026-07-27/28** — a controlled A/B on identical input flipped `--ref` from exit 9 to exit 0 via the catalog-backed upload fallback, with the anti-silence guard [an unbindable ref aborts non-zero and writes no image] pinned by a live e2e; picker DOM + HAR showed Flow indexes a short auto-caption, NOT the prompt, so a prompt-derived search hint was dropped rather than shipped on assumption; a CDP spike against Flow's own character flow then captured the `entityContext` contract that gflow's generations were missing, root-causing #395 to two gflow defects [overlay dismissal Escaping Flow's own composer, and a character-route bounce that sent the prompt to the project composer] — both fixed, both character e2e tests now pass live, including `--format-prompt` [#383], with a read-back confirming the character carries its name and `thumbnail_media_id`). Prior: [v0.44.0](LIVE_VERIFICATION_v0.44.0.md) (**#381 dual-side project management & Playwright Chromium transport live-verified 2026-07-26** — real-editor project creation + rename tRPC server/DOM sync, prompt slugging, `gflow project` subcommand family, HTTP 429 adaptive backoff, and full E2E test suite). Prior: [v0.43.0](LIVE_VERIFICATION_v0.43.0.md) (**private incident diagnostics live-verified 2026-07-23, 1 Veo credit**). Prior: [v0.42.0](LIVE_VERIFICATION_v0.42.0.md) (**#361 production-readiness live-gaps confirmed live 2026-07-21, 1 Veo credit** — a real `veo-lite` t2v through the worker path persisted a real `remote_started` checkpoint [observer→checkpoint→DB chain confirmed], crash-recovery classified the task `indeterminate` without resubmitting, and mid-launch cancellation released the `ProfileLease` credit-free; full evidence in [v0.40.0-production-readiness § "2026-07-21 live follow-up"](LIVE_VERIFICATION_v0.40.0-production-readiness.md#2026-07-21-live-follow-up-0420-cycle); #359 content-safety `400`→`ContentPolicyError` classification is unit-covered, not live-triggered [would require a deliberate policy violation]; #360/#362 are docs-only, verified by the documentation gates). Prior: [v0.41.0](LIVE_VERIFICATION_v0.41.0.md) (**#357 production-readiness hardening — stale-session fail-fast, free image gen, paid veo-lite T2V all proven live**). Prior: [v0.40.0](LIVE_VERIFICATION_v0.40.0.md) (**#344 `@`-mention asset-tagging resolution proven live e2e, ~2 Imagen credits** — `gflow character create` staged a real taggable character [bound reference images, `has_reference_images` guard], the e2e test's documented propagation wait cleared Flow's `projectInitialData` lag, and `gflow image t2i "@Zoro …"` passed with returncode 0, a real generated image, and the correctly de-tagged prompt in the catalog — no code changes needed, `resolve_and_apply` as merged in #344 already works end-to-end; pre-existing unrelated issue #174 [Flow media-library A/B flake] can still intermittently block generation regardless of this feature — recorded, not omitted). Prior: [v0.39.0](LIVE_VERIFICATION_v0.39.0.md) (**#341 failed-generation persistence proven live** — a real `image t2i` on denon82 failed at the wire [`batchGenerateImages` HTTP 400 → `WireFormatError`] and the record-on-catch funnel wrote the **first-ever `failed` row** into the production catalog [`error_type=wire-format`, redacted `error_detail`, browsable via `gflow data list errors`], **$0**; the remaining paid paths [video/chain/batch/movie/worker] are funnel-regression-tested, not force-failed live [would cost credits], and the status-aware `succeeded=false` video-poll fix is unit-locked — recorded, not omitted). Prior: [v0.38.1](LIVE_VERIFICATION_v0.38.1.md) (**#338 agentic-pin recovery proven live ON the pinned account** — run 1 caught the composer-render race the unit suite could not [`ensure_media_incomplete` +115 ms, toggle never reached]; the readiness-wait fix landed and run 2 recovered classic on denon82 after ~2h of pin [`ui_driver.bound mode=classic`, real 768×1376 JPEG, exact prompt adherence]; reload branch unit-locked, live trigger not observed this cycle — recorded, not omitted). Prior: [v0.38.0](LIVE_VERIFICATION_v0.38.0.md) (**#332 mode control + #314 i2i ref dedup proven live e2e** — `image t2i --ui-mode classic` recovered agentic→classic in a real run [`ui_mode.attempt_exit_agent` → full classic chain, 1376×768 JPEG]; two identical `image i2i` runs proved the dedup contract [run 1: picker miss → `image_uploaded`; run 2: `reference_deduped_by_filename`, ZERO uploads]; `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 15.2 MB `ftyp` mp4]; autopilot #333 recorded deferred-with-reason [hermes-ops deployment staged separately]). Prior: [v0.37.0](LIVE_VERIFICATION_v0.37.0.md) (**viewport 1920×1080 + agentic count enforcement + FIPS-safe SAPISIDHASH proven live e2e** — `image t2i` [classic cohort, real 1376×768 JPEG] and `video t2v` veo-fast [`MEDIA_GENERATION_STATUS_SUCCESSFUL`, 11.5 MB `ftyp` mp4] both succeeded end-to-end at the new 1920×1080 viewport with every selector resolving [no drift]; SAPISIDHASH digest verified byte-identical [FIPS-safe `usedforsecurity=False`], auth unchanged). Prior: [v0.36.0](LIVE_VERIFICATION_v0.36.0.md) (**#316 diagnostic tooling live-verified against real Flow traffic** — `GFLOW_CLI_HAR_PATH` captured a real 54-entry HAR [real Flow domains, 34× 200s, and a genuine 401 the tool exists to diagnose]; `GFLOW_CLI_DEBUG_TRACEBACK`'s typed-error scoping confirmed live [console output identical with/without the flag on a `GFlowError`]; unhandled-path behavior covered by 6 new tests (30 total across both files) + SDD task review; #312 reference-entity-smuggling fix covered by its own dedicated e2e test). Prior: [v0.35.0](LIVE_VERIFICATION_v0.35.0.md) (**#305-follow-up multimodal reverse-engineering & storyboard tool proven live e2e** — `gflow tools run storyboard` successfully deconstructed a cyberpunk scene into a cohesive 4-panel sequence; `reverse-engineer` tool extracts frames from video streams/URLs using `claude-video`'s `watch.py` and produces structured prompt components using Gemini multimodal models; dynamic token budgeting and strict Pyright types verified via test suite). Prior: [v0.34.0](LIVE_VERIFICATION_v0.34.0.md) (**#299 `--ui-mode` gate proven live, ZERO credits** — drove `get_ui_driver` directly over 4 real editor loads, never generated: bidirectional switch works [classic→agentic via `_force_agent_mode`, agentic→classic via `_exit_agent_mode`, each DOM-reverified], `agentic`-when-already-agentic is idempotent, and a timed-out toggle → **exit-28 fail-fast before submission**; deprecation behavior-change [`prefer_classic`→exit 28] confirmed). Prior: [v0.33.0](LIVE_VERIFICATION_v0.33.0.md) (**#287-follow-up picker fix proven live on the original repro** — the v0.32.1-failing `i2v <uuid> --project <crowded>` command now exits 0 with a real 3.0 MB `ftyp` mp4, `frame_ref_attached` + `video_saved`, zero uploads; **#241 jitter live-verified on both paths** — flag `--jitter 4-6` → `batch_jitter_sleep seconds=4.98`, and the new 0.5–1.5 s default → `seconds=1.47`, each firing exactly once between two t2i submissions; environment note: the denon82 cohort is now natively agentic and round-2 generations hit the pre-existing #281 `MediaAttributionError`, not a regression). Prior: [v0.32.1](LIVE_VERIFICATION_v0.32.1.md) (**#293 teardown fix live-verified credit-free** — error-path aborts leave ZERO chrome.exe holding the profile [3× leak reproduced pre-fix same day]; force-close fallback + ProfileLockedError translation unit-pinned; #283 wave logic fixes mock-verified to exact call counts). Prior: [v0.32.0](LIVE_VERIFICATION_v0.32.0.md) (**#287 UUID i2v frames proven live e2e** — an in-project asset selected by media UUID in the frame-slot dialog [frame_ref_attached, startImage bound on the wire, ZERO upload events] produced a real 720×1280 interpolation, resolving the #237 negative prior; foreign UUID → exit 9 pre-generation with screenshot; **#288 duration fail-fast proven live** — exit 23 pre-submit saved a 10-credit generation, and the debug screenshot confirmed the duration control is ABSENT from the cohort's settings popover [locale hypothesis refuted]; upload-400 exit-27 repro deferred-with-reason — the original rejected JPEG no longer exists). Prior: [v0.31.0](LIVE_VERIFICATION_v0.31.0.md) (**#281 wrong-media defenses live-verified in BOTH directions, credit-free** — correct attribution downloads with real wire metadata [seed, 768×1376]; the incident-class lazy-render ambiguity reproduced live and hard-stopped with `MediaAttributionError` exit 26 naming every candidate UUID, no file written; **#282 two-UUID-ref i2i proven e2e** — both freshly generated portrait UUIDs picker-selected into one scene with both canonical identities visually transferred). Prior: [v0.30.0](LIVE_VERIFICATION_v0.30.0.md) (**agentic-cohort image path + both fixes live-verified credit-free** — native 768×1376 stills, i2i-chain + canonical-ref identity hold; the character-create `DataIntegrityError` and the `prefer_classic` WARNING were observed live then fixed [recorder idempotent + INFO log]; MCP video-param feature deferred-with-reason on Veo credits, per the stills-only goal). Prior: [v0.29.0](LIVE_VERIFICATION_v0.29.0.md) (**persistent `gflow instructions` CRUD proven live e2e GREEN, credit-free** — 11-command sequence on a fresh project: add incl. `--ref <image-UUID>` attach, list/enable/disable, master toggle both ways, TOML `apply` destructive full-sync with `enabled=false` honored, `rm` with server card-id preserved across mutations; movie brief-sync code-path-verified via the same primitives, deferred-with-reason on credits; MCP `gflow_instructions_*` tools are thin adapters over the live-verified primitives). Prior: [v0.28.0](LIVE_VERIFICATION_v0.28.0.md) (**agent instructions `-i` now steer agentic generation — crayon e2e GREEN**: a style-neutral prompt + an enabled "crayon" card produced an unmistakable crayon drawing through the real transport; root causes were conversational phrasing + the `project_brief.enabled` master switch). Prior: [v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (**v0.27.0 release follow-up fixes and documentation sync**). Prior: [v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (**`[style]` block with named variants + prompt-aware resume — credit-free CLI verification**: real `movie run --dry-run` 3-way ledger proving resolved-style display, `skip (done)` on matching `style_hash`, and `re-run (style changed)` after a style edit; composition is local, wire path untouched, so no Veo credits spent — first credited styled run will confirm visually). Prior: [v0.26.0](LIVE_VERIFICATION_v0.26.0.md) (**image i2i by generated-image UUID proven live e2e GREEN** — the existing asset is *selected in place* by its media UUID, no duplicate upload, producing an i2i output that references it; plus generated-image `display_name` capture, credited @C1ph3r404). Prior: [v0.25.0](LIVE_VERIFICATION_v0.25.0.md) (**#237 remote-UUID i2v proven live e2e GREEN** — a real 8s 720×1280 interpolation from a generated image's UUID, after the picker-search attach was reworked to local upload; #240 home-`.env` matrix live; plus two silent-failure guards root-caused live: video-as-image download rejection and rejected-upload fail-loud). Prior: [v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
139
139
  **"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. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
140
140
  **"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)
141
141
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,135 @@
1
+ # Live Verification — v0.46.0
2
+
3
+ **Date:** 2026-07-28
4
+ **Feature under test:** provider-agnostic prompt-tools transport ([#387](https://github.com/ffroliva/gflow-cli/issues/387), PR [#400](https://github.com/ffroliva/gflow-cli/pull/400))
5
+ **Verifier:** repo owner, local Windows 11 workstation
6
+ **Credit cost:** zero — the prompt tools call an LLM endpoint, never Flow's generation API.
7
+
8
+ ## Why this release needs live verification
9
+
10
+ The whole point of #387 is that gflow now talks to an **external service it does not
11
+ control**, chosen at runtime by the user. Offline tests inject a fake transport — which
12
+ is precisely the seam under test — so they cannot prove the wire format is right. Two
13
+ defects in this release were invisible to a fully green offline suite and were caught
14
+ only here (see §4).
15
+
16
+ ---
17
+
18
+ ## 1. Endpoint capability spike
19
+
20
+ `scripts/diag/spike_387_openai_compat.py`, stdlib `urllib` (deliberately not the `openai`
21
+ SDK — an SDK would paper over the header/param quirks this exists to discover).
22
+
23
+ | Probe | freellmapi (non-Google) | Google compat endpoint |
24
+ |---|---|---|
25
+ | text `chat/completions` | PASS 0.7 s | PASS 0.5 s |
26
+ | `temperature` + `max_tokens` | PASS 0.5 s | PASS 0.5 s |
27
+ | **multimodal `image_url` data URI (semantic)** | **PASS** — answered `'Red'` | **PASS** — answered `'Red'` |
28
+ | bad key ⇒ 4xx | 401 | 400 |
29
+
30
+ Probe 3 is deliberately **semantic**, not status-based: it generates a solid-red 64×64
31
+ JPEG and asks the model for the colour. A gateway that silently drops the image part
32
+ still returns HTTP 200 with plausible prose, so a status check would prove nothing.
33
+
34
+ **Consequences settled rather than assumed:** multimodal works on both, so the native
35
+ Gemini `inlineData` path was deleted outright with no dual-path fallback;
36
+ `max_completion_tokens` is not needed; and 0.5–1.2 s latency against a 60 s budget means
37
+ no configurable timeout knob was added.
38
+
39
+ ---
40
+
41
+ ## 2. Five-layer ledger — real CLI, real endpoints
42
+
43
+ Exercised through `gflow tools run creative-director … --json`, i.e. the production code
44
+ path, not a test harness.
45
+
46
+ | # | Layer | Evidence |
47
+ |---|---|---|
48
+ | 1 | Command exits 0 | `gflow tools run creative-director "cat in space" --json` → exit 0 |
49
+ | 2 | Response shape | `{"name","original","expanded","was_expanded"}`, `was_expanded: true` |
50
+ | 3 | Content actually rewritten | 12-char input → 1096-char output; `original_len=12 expanded_len=1096` in the structlog event |
51
+ | 4 | structlog invariants | `prompt_expander_endpoint host=127.0.0.1:3001` (audit trail), then `prompt_expanded model=gemini-2.5-flash` |
52
+ | 5 | User-confirmable artifact | Full five-component rewrite returned — named camera body, nebula setting, lighting, composition |
53
+
54
+ ### Configuration matrix
55
+
56
+ | Configuration | Expected | Observed |
57
+ |---|---|---|
58
+ | gateway + key + model | rewritten | `was_expanded: true`, host `127.0.0.1:3001` |
59
+ | gateway + key, **no model** (gateway chooses) | rewritten | `was_expanded: true` |
60
+ | **key only** (default Google endpoint) | rewritten | `was_expanded: true`, host `generativelanguage.googleapis.com` |
61
+ | removed `GFLOW_CLI_GEMINI_API_KEY` only | loud warning + no-op | stderr warning emitted; `prompt_expander_not_configured`; `was_expanded: false` |
62
+ | nothing configured | silent no-op, **no network call** | `prompt_expander_not_configured`; `was_expanded: false`; no endpoint log |
63
+
64
+ The fourth row is the one that matters for a breaking change: because the prompt tools
65
+ never fail a run, an unmigrated user would otherwise see no error at all — just silently
66
+ un-rewritten prompts on full-price generations.
67
+
68
+ ---
69
+
70
+ ## 3. Integration suite
71
+
72
+ `tests/integration/test_expander_gateway.py`, `containers` marker, skips cleanly when no
73
+ endpoint is reachable so CI and other contributors are unaffected.
74
+
75
+ | Target | Result |
76
+ |---|---|
77
+ | Google compat endpoint | **6 / 6 passed** |
78
+ | freellmapi gateway | 4 passed, **2 skipped on a proven HTTP 429** |
79
+
80
+ Rate limiting is classified, not swallowed: the expander never raises, so a failed
81
+ expansion carries no reason. On failure the helper makes one raw probe and skips **only**
82
+ when a 429 is proven — a genuine transport break still fails the suite. The 429 was the
83
+ gateway's free-tier quota (`"All models exhausted. Add more API keys or wait for rate
84
+ limits to reset."`), reached after repeated runs; the retry loop backed off three times
85
+ and fell back cleanly, which is the designed behaviour.
86
+
87
+ ---
88
+
89
+ ## 4. Defects found *here* that the offline suite missed
90
+
91
+ Both were found with 2849 offline tests passing.
92
+
93
+ 1. **Google's compat endpoint has no server-side default model.** Omitting `model`
94
+ returns `400 "model is not specified"`, which the never-raise contract turns into a
95
+ silent no-op — the default configuration was broken while every unit test passed.
96
+ Omitting the model is correct only for a *user-chosen* gateway; the default endpoint
97
+ now ships a matching default. Pinned by a regression test.
98
+ 2. **The first redirect guard did not work.** `urllib.request.build_opener()` installs
99
+ its default handler set regardless of what you pass it, so omitting
100
+ `HTTPRedirectHandler` left redirects enabled — meaning `Authorization` would still
101
+ have been replayed cross-host. The handler had to be *replaced*. Caught because the
102
+ test asserts the behaviour (`redirect_request` returns `None`) rather than the
103
+ handler list.
104
+
105
+ A third was found while running the release gates: `tests/e2e/test_tools_e2e.py` gated on
106
+ the removed `GFLOW_CLI_GEMINI_API_KEY`, so it would have skipped forever while appearing
107
+ healthy.
108
+
109
+ ---
110
+
111
+ ## 5. Not verified this cycle
112
+
113
+ - **Keyless gateway against a real server.** Header omission is proven by unit test
114
+ (`test_authorization_header_omitted_when_keyless`), but no keyless endpoint was
115
+ available — freellmapi requires its unified key. The code path is identical apart from
116
+ the absent header.
117
+ - **`--tool` on a real generation command** (`image t2i --tool …`). The tool layer is
118
+ verified end to end above; the generation wiring is unchanged by this release and is
119
+ covered by `tests/e2e/test_tools_e2e.py`, which is gated on an authenticated profile.
120
+
121
+ ---
122
+
123
+ ## Gate summary
124
+
125
+ | Gate | Result |
126
+ |---|---|
127
+ | Offline suite | 2849 passed, 5 skipped |
128
+ | Coverage | 91% (floor 80%) |
129
+ | ruff · ruff-format · pyright | clean · clean · 0 errors |
130
+ | repo hygiene · doc links · website PII · mirror+nav | all pass |
131
+ | CI on PR #400 | 13/13 pass |
132
+ | SonarCloud quality gate | **GREEN** — zero new issues |
133
+ | `/ponytail-review` xhigh | 3 cuts applied |
134
+ | `security-review` | no HIGH/MEDIUM findings |
135
+ | `/code-review high` | **not run** — user-triggered only, cannot be launched by the agent |
@@ -3,8 +3,8 @@
3
3
  `creative-director` is the first built-in [tool](TOOLS.md). It rewrites a terse prompt into a
4
4
  single, vivid, self-contained prompt using Google's officially validated **five-component
5
5
  formula**, optionally injecting domain-specific (cinema / portrait / product / …) vocabulary, and
6
- deterministically strips low-signal "quality-booster" keywords. It calls the public **Gemini API**
7
- server-side and is **never fatal** — any failure degrades to your original prompt.
6
+ deterministically strips low-signal "quality-booster" keywords. It calls any **OpenAI-compatible**
7
+ endpoint server-side and is **never fatal** — any failure degrades to your original prompt.
8
8
 
9
9
  > This is the tool. For the framework that hosts it (`gflow tools`, `--tool`, the TOML schema, MCP
10
10
  > exposure), see [TOOLS.md](TOOLS.md).
@@ -14,8 +14,9 @@ server-side and is **never fatal** — any failure degrades to your original pro
14
14
  ## 1. Quick start
15
15
 
16
16
  ```console
17
- # 1. Get a Gemini API key: https://aistudio.google.com/apikey
18
- export GFLOW_CLI_GEMINI_API_KEY="..."
17
+ # 1. Point at any OpenAI-compatible endpoint. A Google key works out of the
18
+ # box against the default endpoint: https://aistudio.google.com/apikey
19
+ export GFLOW_CLI_LLM_API_KEY="..." # any OpenAI-compatible endpoint; see CONFIGURATION.md
19
20
 
20
21
  # 2. Preview an expansion (free of Flow credits)
21
22
  gflow tools run creative-director "a cat on a couch" --style cinema
@@ -25,7 +26,7 @@ gflow image t2i "a fox in the snow" --tool creative-director:style=cinema
25
26
  gflow video t2v "a city at night" -t creative-director:style=cinematic
26
27
  ```
27
28
 
28
- Without `GFLOW_CLI_GEMINI_API_KEY` the tool silently leaves your prompt unchanged (see §6).
29
+ Without `GFLOW_CLI_LLM_API_KEY` (or `GFLOW_CLI_LLM_BASE_URL`) the tool leaves your prompt unchanged (see §6).
29
30
 
30
31
  ---
31
32
 
@@ -40,7 +41,7 @@ Without `GFLOW_CLI_GEMINI_API_KEY` the tool silently leaves your prompt unchange
40
41
  | **Provenance** | `AppliedTool(name, version, model, config_hash, params)` | Recorded in history when a tool rewrote a prompt. |
41
42
 
42
43
  The tool itself lives in [`src/gflow_cli/tools/`](../src/gflow_cli/tools/): `spec.py` (schema),
43
- `runtime.py` (`apply_tool`), `expander.py` (the Gemini-backed `PromptExpander`), `banned.py`
44
+ `runtime.py` (`apply_tool`), `expander.py` (the provider-agnostic `PromptExpander`), `banned.py`
44
45
  (keyword stripping), `invocation.py` (provenance + MCP adapter).
45
46
 
46
47
  ---
@@ -134,17 +135,22 @@ prompt the tool left unchanged is never altered.
134
135
 
135
136
  ## 6. Never-fatal contract
136
137
 
137
- The Gemini-backed `PromptExpander` ([`expander.py`](../src/gflow_cli/tools/expander.py)) is
138
+ The `PromptExpander` ([`expander.py`](../src/gflow_cli/tools/expander.py)) is
138
139
  stdlib-only (`urllib`) and bounded. `expand()` returns the original prompt with
139
140
  `was_expanded=False` — never raising — in every degraded case:
140
141
 
141
- - `GFLOW_CLI_GEMINI_API_KEY` is missing.
142
+ - Neither `GFLOW_CLI_LLM_API_KEY` nor `GFLOW_CLI_LLM_BASE_URL` is set.
143
+ - `GFLOW_CLI_LLM_BASE_URL` is wrong (bad host, missing `/v1`).
144
+ - `GFLOW_CLI_LLM_MODEL` names a model the endpoint does not serve.
142
145
  - Any HTTP error, network failure, timeout, or malformed JSON.
143
146
  - An empty, whitespace-only, or quote-only model response.
144
147
 
145
148
  Retryable statuses (`429, 500, 502, 503, 504`) are retried with exponential backoff (default 3
146
- attempts, base delay 1s, doubling); **`401` / `403` fail fast** (and still degrade to the
147
- original). Each attempt has a 20s socket timeout, and the whole call is bounded by an **overall
149
+ attempts, base delay 1s, doubling); every other 4xx **fails fast** (and still degrades to the
150
+ original). Providers disagree on the code for a bad key — most gateways answer `401`, Google's
151
+ compat endpoint answers `400` — but neither is retryable, so both fall back immediately rather
152
+ than burning the retry budget. Each attempt has a 20s socket timeout, and the whole call is
153
+ bounded by an **overall
148
154
  ~60s wall-clock budget** (`max_total_seconds`): retries stop once the budget is spent and each
149
155
  attempt's timeout is clamped to the remaining budget, so sustained rate limiting can never stall a
150
156
  batch for the full timeout×retries schedule. (Both bounds are fixed defaults, not env-tunable.)
@@ -154,15 +160,25 @@ abort a generation** — the worst case is "your prompt went through unchanged."
154
160
 
155
161
  ---
156
162
 
157
- ## 7. Gemini wiring (I/O)
163
+ ## 7. LLM wiring (I/O)
164
+
165
+ The transport speaks the **OpenAI Chat Completions API** — the format OpenAI, gateways/proxies,
166
+ local runtimes and Google's compatibility endpoint all accept. See
167
+ [CONFIGURATION.md](CONFIGURATION.md#prompt-tools-llm-gflow_cli_llm_) for the full env-var
168
+ reference and worked examples (Google, OpenRouter, a local Docker proxy, keyless Ollama).
158
169
 
159
170
  | Aspect | Value |
160
171
  |---|---|
161
- | Endpoint | `https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent` |
162
- | Auth | API key in the `x-goog-api-key` header (never on the query string). |
163
- | Default model | `gemini-2.5-flash` (TOML `config.model`; `GFLOW_CLI_GEMINI_MODEL` overrides globally). |
164
- | Request | `system_instruction` = built instruction; user `contents` = the (truncated) prompt; `temperature=0.7`, `maxOutputTokens=1024`. |
165
- | Response | First candidate's text, cleaned (quote-stripped, truncated). |
172
+ | Endpoint | `{GFLOW_CLI_LLM_BASE_URL}/chat/completions` — default base `https://generativelanguage.googleapis.com/v1beta/openai` |
173
+ | Auth | `Authorization: Bearer <GFLOW_CLI_LLM_API_KEY>`, in the header, never the query string. **Omitted entirely** when no key is set, for keyless local gateways. |
174
+ | Redirects | Never followed — `urllib` would re-send the `Authorization` header to whatever host a redirect names. |
175
+ | Model | TOML `config.model` pin > `GFLOW_CLI_LLM_MODEL` > default-endpoint default > omitted so the gateway chooses. The builtins pin nothing. |
176
+ | Request | `messages` = `[{role: system, content: instruction}, {role: user, content: prompt}]`; `temperature=0.7` (0.4 multimodal); `max_tokens` derived from `max_output_chars`. |
177
+ | Multimodal | Images ride the user message as `{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,…"}}` parts. |
178
+ | Response | `choices[0].message.content`, cleaned (markdown fence and wrapping quotes stripped, truncated). `null` content — a refusal — degrades to the original. |
179
+
180
+ > The system instruction is a **separate `system` message**, not concatenated onto the user's
181
+ > prompt as it was under the Gemini-native shape.
166
182
 
167
183
  ---
168
184
 
@@ -222,8 +238,9 @@ UX from agent-invoked tools), but no new work should depend on it. See
222
238
 
223
239
  | Env var | Default | Purpose |
224
240
  |---|---|---|
225
- | `GFLOW_CLI_GEMINI_API_KEY` | — | Required to actually rewrite prompts. [Get a key](https://aistudio.google.com/apikey). |
226
- | `GFLOW_CLI_GEMINI_MODEL` | `gemini-2.5-flash` | Global override of the tool's default model. |
241
+ | `GFLOW_CLI_LLM_BASE_URL` | Google compat endpoint | OpenAI-compatible endpoint. The on/off switch. |
242
+ | `GFLOW_CLI_LLM_API_KEY` | — | Credential for that endpoint; optional for a keyless local gateway. [Google key](https://aistudio.google.com/apikey). |
243
+ | `GFLOW_CLI_LLM_MODEL` | — | Model, and therefore the provider selector. |
227
244
  | `GFLOW_CLI_HISTORY_PROMPTS` | `store` | `redacted` withholds the expanded prompt and minimizes the recorded tool descriptor (§8). |
228
245
 
229
246
  See [CONFIGURATION.md](CONFIGURATION.md) for the full precedence chain.
@@ -11,7 +11,7 @@
11
11
  | Console/JSON output under `GFLOW_CLI_DEBUG_TRACEBACK` (opt-in, off by default) | Raw exception text may echo tokens/cookies present in error state, especially if piped to a shared/persistent system (CI logs, aggregators) | Medium–High (depends on destination) |
12
12
  | Generated outputs (`$GFLOW_CLI_OUTPUT_DIR/...`) | Unwanted disclosure | Medium (depends on content) |
13
13
  | Local database (`$GFLOW_CLI_HOME/gflow.db`) | Disclosure of prompt history and asset provenance | Low–Medium (depends on prompt content; use `GFLOW_CLI_HISTORY_PROMPTS=redacted` to reduce) |
14
- | `.env` file with `GFLOW_CLI_GEMINI_API_KEY` | Theft → API quota theft, billing | Medium |
14
+ | `.env` file with `GFLOW_CLI_LLM_API_KEY` | Theft → API quota theft, billing | Medium |
15
15
  | Project-internal logs | Leaking prompts / asset IDs | Low |
16
16
 
17
17
  ## What we don't do
@@ -41,7 +41,7 @@
41
41
 
42
42
  Not used by v0.4.0a2's reverse-engineered Flow provider. Documented here in advance of `GFLOW_CLI_PROVIDER=official`.
43
43
 
44
- - **Location:** `$GFLOW_CLI_GEMINI_API_KEY` env var, optionally loaded from a `.env` file in the directory where you invoke `gflow` or from `$GFLOW_CLI_HOME/.env` (CWD wins on conflicts; see [CONFIGURATION.md](CONFIGURATION.md#env-loading)). Treat BOTH locations as secret-bearing files: keep `$GFLOW_CLI_HOME/.env` user-readable only and out of shared images/backups.
44
+ - **Location:** `$GFLOW_CLI_LLM_API_KEY` env var, optionally loaded from a `.env` file in the directory where you invoke `gflow` or from `$GFLOW_CLI_HOME/.env` (CWD wins on conflicts; see [CONFIGURATION.md](CONFIGURATION.md#env-loading)). Treat BOTH locations as secret-bearing files: keep `$GFLOW_CLI_HOME/.env` user-readable only and out of shared images/backups.
45
45
  - **In memory:** Held only in the `Settings` dataclass, never logged.
46
46
  - **In transit:** Sent only to `generativelanguage.googleapis.com` over HTTPS.
47
47
  - **Rotate:** Set a new value in `.env`, restart the CLI. No persistence beyond the env var.