gflow-cli 0.28.0__tar.gz → 0.30.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 (526) hide show
  1. gflow_cli-0.30.0/.claude/commands/gflow/check.md +78 -0
  2. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/AGENTS.md +4 -4
  3. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/CHANGELOG.md +32 -1
  4. gflow_cli-0.30.0/GEMINI.md +37 -0
  5. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/PKG-INFO +5 -4
  6. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/PLAN.md +3 -1
  7. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/README.md +3 -2
  8. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/INDEX.md +4 -2
  9. gflow_cli-0.30.0/docs/INSTRUCTIONS.md +169 -0
  10. gflow_cli-0.30.0/docs/LIVE_VERIFICATION_v0.29.0.md +89 -0
  11. gflow_cli-0.30.0/docs/LIVE_VERIFICATION_v0.30.0.md +53 -0
  12. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/MCP.md +11 -2
  13. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/MOVIE.md +27 -0
  14. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/PROJECT_STATUS.md +19 -1
  15. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/USAGE.md +31 -0
  16. gflow_cli-0.30.0/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +342 -0
  17. gflow_cli-0.30.0/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +75 -0
  18. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/llms.txt +4 -0
  19. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/pyproject.toml +2 -2
  20. gflow_cli-0.30.0/scripts/spike_waf_camoufox.py +352 -0
  21. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/gflow-cli/SKILL.md +32 -0
  22. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/pr-council-review/SKILL.md +27 -2
  23. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/__init__.py +1 -1
  24. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/client.py +20 -1
  25. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/image.py +108 -7
  26. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/drivers/factory.py +18 -8
  27. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/ui_automation.py +63 -19
  28. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/ui_automation_video.py +6 -5
  29. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli.py +2 -0
  30. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_image.py +5 -2
  31. gflow_cli-0.30.0/src/gflow_cli/cli_instructions.py +754 -0
  32. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_movie.py +113 -0
  33. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/composition.py +19 -0
  34. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/recorder.py +9 -1
  35. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/mcp/tools.py +409 -5
  36. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/movie_manifest.py +88 -0
  37. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client.py +59 -0
  38. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_image.py +165 -0
  39. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/drivers/test_factory.py +2 -2
  40. gflow_cli-0.30.0/tests/api/transports/test_selector_symmetry.py +42 -0
  41. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_ui_automation.py +83 -0
  42. gflow_cli-0.30.0/tests/cli/test_cli_instructions.py +402 -0
  43. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_movie.py +104 -1
  44. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_tools.py +6 -0
  45. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_movie_manifest.py +46 -0
  46. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_recorder_character.py +48 -0
  47. gflow_cli-0.30.0/tests/features/instructions.feature +22 -0
  48. gflow_cli-0.30.0/tests/features/test_instructions_steps.py +263 -0
  49. gflow_cli-0.30.0/tests/mcp/test_cli_parity.py +127 -0
  50. gflow_cli-0.30.0/tests/mcp/test_tools_instructions.py +251 -0
  51. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/mcp/test_tools_wired.py +74 -0
  52. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/uv.lock +11 -11
  53. gflow_cli-0.28.0/.claude/commands/gflow/check.md +0 -59
  54. gflow_cli-0.28.0/GEMINI.md +0 -31
  55. gflow_cli-0.28.0/docs/superpowers/plans/2026-07-08-agentic-instructions/PLAN.md +0 -329
  56. gflow_cli-0.28.0/docs/superpowers/plans/2026-07-08-agentic-instructions/spike-findings.md +0 -210
  57. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/README.md +0 -0
  58. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/active.md +0 -0
  59. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/branch-review.md +0 -0
  60. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/changelog.md +0 -0
  61. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/doc-review.md +0 -0
  62. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  63. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  64. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/known-issues.md +0 -0
  65. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/next.md +0 -0
  66. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/plan.md +0 -0
  67. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  68. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/predict.md +0 -0
  69. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/release.md +0 -0
  70. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/scenario.md +0 -0
  71. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/sonar.md +0 -0
  72. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.claude/commands/gflow/status.md +0 -0
  73. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.env.template +0 -0
  74. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.gitattributes +0 -0
  75. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/CODEOWNERS +0 -0
  76. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  77. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/copilot-instructions.md +0 -0
  78. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/dependabot.yml +0 -0
  79. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/workflows/ci.yml +0 -0
  80. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/workflows/external-pr-triage.yml +0 -0
  81. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/workflows/governance-advisory.yml +0 -0
  82. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/workflows/governance-benchmark.yml +0 -0
  83. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/workflows/main-base-guard.yml +0 -0
  84. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.github/workflows/release.yml +0 -0
  85. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.gitignore +0 -0
  86. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.gitleaks.toml +0 -0
  87. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.pre-commit-config.yaml +0 -0
  88. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/.secrets.baseline +0 -0
  89. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/CLAUDE.md +0 -0
  90. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/CONFIGURATION.md +0 -0
  91. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/CONTRIBUTING.md +0 -0
  92. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/DISCLAIMER.md +0 -0
  93. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/KNOWN_ISSUES.md +0 -0
  94. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/LICENSE +0 -0
  95. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/RELEASE.md +0 -0
  96. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/ROADMAP.md +0 -0
  97. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/conftest.py +0 -0
  98. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docker-compose.yml +0 -0
  99. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/AGENT_GUIDE.md +0 -0
  100. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/AGENT_UI_E2E.md +0 -0
  101. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/AGENT_UI_RECON.md +0 -0
  102. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/ARCHITECTURE.md +0 -0
  103. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/AUTHENTICATION.md +0 -0
  104. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/CHARACTER.md +0 -0
  105. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/CHARACTER_RECON.md +0 -0
  106. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/CONFIGURATION.md +0 -0
  107. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/DATA_LAYER.md +0 -0
  108. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/DEBUGGING.md +0 -0
  109. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/DEMOS.md +0 -0
  110. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/DEVELOPMENT.md +0 -0
  111. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/E2E_TESTING.md +0 -0
  112. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/EXTERNAL_STORAGE.md +0 -0
  113. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/GITHUB.md +0 -0
  114. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  115. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  116. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  117. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  118. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  119. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  120. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  121. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  122. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  123. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  124. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  125. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  126. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  127. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  128. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  129. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  130. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  131. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  132. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  133. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  134. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
  135. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
  136. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
  137. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  138. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  139. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  140. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  141. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  142. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/PROMPT_EXPANSION.md +0 -0
  143. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/SECURITY.md +0 -0
  144. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/TOOLS.md +0 -0
  145. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/USER_GUIDE.md +0 -0
  146. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/assets/demo-split-pf.gif +0 -0
  147. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/assets/example-run.gif +0 -0
  148. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/assets/examples.webp +0 -0
  149. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/medium_tutorial.md +0 -0
  150. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/schemas/movie-handoff.schema.json +0 -0
  151. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/sonar-cleanup-tracker.md +0 -0
  152. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  153. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  154. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  155. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  156. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  157. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  158. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  159. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  160. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  161. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  162. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  163. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  164. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/README.md +0 -0
  165. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/batch_from_config.py +0 -0
  166. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/multi_prompt_t2i.py +0 -0
  167. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/sample_config.json +0 -0
  168. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/sample_prompts.txt +0 -0
  169. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/single_image_t2i.py +0 -0
  170. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/examples/workflow_chain.py +0 -0
  171. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/README.md +0 -0
  172. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/01_upload_image.json +0 -0
  173. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  174. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  175. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/04_archive_workflow.json +0 -0
  176. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/05_createProject.json +0 -0
  177. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/06_batchGenerateImages.json +0 -0
  178. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  179. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  180. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  181. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  182. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  183. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/12_create_scene.json +0 -0
  184. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  185. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/14_get_scene_workflows.json +0 -0
  186. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  187. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/ci/check_doc_links.py +0 -0
  188. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/ci/check_materiality.py +0 -0
  189. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/ci/check_repo_hygiene.py +0 -0
  190. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/debug_editor.py +0 -0
  191. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/debug_gen_settings.py +0 -0
  192. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/debug_settings.py +0 -0
  193. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/_recording_client.py +0 -0
  194. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/_spike_common.py +0 -0
  195. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/active_plan.py +0 -0
  196. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  197. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  198. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  199. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  200. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  201. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  202. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/capture_locale_invariants.py +0 -0
  203. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  204. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/character_create_spike.py +0 -0
  205. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/character_create_spike_v2.py +0 -0
  206. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/dump_character_selectors.js +0 -0
  207. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/make_project.py +0 -0
  208. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/materiality_backtest.py +0 -0
  209. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/monitor_pr_38.py +0 -0
  210. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/patch_character.py +0 -0
  211. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/skillopt/README.md +0 -0
  212. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/skillopt/harness.py +0 -0
  213. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/skillopt/tasks.json +0 -0
  214. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  215. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  216. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  217. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  218. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  219. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  220. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  221. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  222. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  223. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  224. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  225. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  226. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  227. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_patch_entity.py +0 -0
  228. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/dev/spike_patchright.py +0 -0
  229. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/diag/README.md +0 -0
  230. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/diag/capture_flow_traffic.py +0 -0
  231. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/diag/memory_profile.py +0 -0
  232. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/diag/recaptcha_mint.py +0 -0
  233. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  234. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  235. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/record_demo.ps1 +0 -0
  236. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/smoke_image.py +0 -0
  237. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/smoke_real_chrome_image.py +0 -0
  238. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/smoke_video_editor.py +0 -0
  239. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/smoke_worker_style.py +0 -0
  240. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/scripts/verify_chrome_auth_viability.py +0 -0
  241. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/README.md +0 -0
  242. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/issue-assessment/SKILL.md +0 -0
  243. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/issue-resolve/SKILL.md +0 -0
  244. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/plan/SKILL.md +0 -0
  245. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/predict/SKILL.md +0 -0
  246. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/scenario/SKILL.md +0 -0
  247. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/skills/status/SKILL.md +0 -0
  248. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/sonar-project.properties +0 -0
  249. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/__main__.py +0 -0
  250. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/_cli_helpers.py +0 -0
  251. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/__init__.py +0 -0
  252. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/_engine.py +0 -0
  253. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/_retry.py +0 -0
  254. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  255. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/character.py +0 -0
  256. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/dto.py +0 -0
  257. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/image_upscale.py +0 -0
  258. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/recaptcha.py +0 -0
  259. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/routes.py +0 -0
  260. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/scene.py +0 -0
  261. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  262. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/_common.py +0 -0
  263. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  264. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/base.py +0 -0
  265. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  266. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
  267. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  268. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  269. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  270. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  271. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  272. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  273. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/api/video.py +0 -0
  274. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/__init__.py +0 -0
  275. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/base.py +0 -0
  276. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/cookies.py +0 -0
  277. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/factory.py +0 -0
  278. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  279. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  280. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/strategies.py +0 -0
  281. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/auth/verification.py +0 -0
  282. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/browser_manager.py +0 -0
  283. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/chain.py +0 -0
  284. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/chain_manifest.py +0 -0
  285. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_character.py +0 -0
  286. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_data.py +0 -0
  287. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_models.py +0 -0
  288. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_run.py +0 -0
  289. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_scene.py +0 -0
  290. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_tools.py +0 -0
  291. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/cli_video.py +0 -0
  292. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/config.py +0 -0
  293. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/__init__.py +0 -0
  294. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/chain_repo.py +0 -0
  295. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  296. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  297. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  298. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  299. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  300. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  301. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  302. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  303. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  304. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/models.py +0 -0
  305. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/queries.py +0 -0
  306. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/redaction.py +0 -0
  307. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/repository.py +0 -0
  308. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/data/store.py +0 -0
  309. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/errors.py +0 -0
  310. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/exceptions.py +0 -0
  311. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/image_batch.py +0 -0
  312. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/json_output.py +0 -0
  313. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/manifest.py +0 -0
  314. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/mcp/__init__.py +0 -0
  315. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/mcp/prompts.py +0 -0
  316. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/mcp/resources.py +0 -0
  317. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/mcp/server.py +0 -0
  318. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/media.py +0 -0
  319. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/observability.py +0 -0
  320. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/paths.py +0 -0
  321. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/profile_store.py +0 -0
  322. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/services/__init__.py +0 -0
  323. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/services/character_create.py +0 -0
  324. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/storage.py +0 -0
  325. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/__init__.py +0 -0
  326. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/banned.py +0 -0
  327. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  328. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  329. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/expander.py +0 -0
  330. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/invocation.py +0 -0
  331. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/loader.py +0 -0
  332. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/registry.py +0 -0
  333. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/runtime.py +0 -0
  334. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/tools/spec.py +0 -0
  335. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/ui/app.py +0 -0
  336. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/ui/server.py +0 -0
  337. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/worker/daemon.py +0 -0
  338. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/src/gflow_cli/worker/queue.py +0 -0
  339. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tasks/lessons.md +0 -0
  340. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/test_assets/sample_batch.json +0 -0
  341. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/test_assets/sample_batch.tsv +0 -0
  342. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/test_assets/sample_batch_invalid.tsv +0 -0
  343. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/__init__.py +0 -0
  344. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/__init__.py +0 -0
  345. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/fixtures/character_gen_response.json +0 -0
  346. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  347. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  348. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  349. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_bearer_redaction.py +0 -0
  350. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_character.py +0 -0
  351. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_character.py +0 -0
  352. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_delete_characters.py +0 -0
  353. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_generate_character.py +0 -0
  354. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_image.py +0 -0
  355. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_launch_kwargs.py +0 -0
  356. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_patch_entity.py +0 -0
  357. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_scene.py +0 -0
  358. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_client_upscale.py +0 -0
  359. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_concurrency.py +0 -0
  360. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_dto.py +0 -0
  361. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_engine.py +0 -0
  362. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_image_dto.py +0 -0
  363. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_image_upscale.py +0 -0
  364. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  365. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_recaptcha.py +0 -0
  366. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_retry.py +0 -0
  367. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_routes.py +0 -0
  368. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_routes_character.py +0 -0
  369. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_routes_scene.py +0 -0
  370. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_sapisidhash_helper.py +0 -0
  371. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_scene_models.py +0 -0
  372. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_video.py +0 -0
  373. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/test_video_request.py +0 -0
  374. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/__init__.py +0 -0
  375. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/conftest.py +0 -0
  376. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/drivers/__init__.py +0 -0
  377. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/drivers/test_agentic.py +0 -0
  378. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_base.py +0 -0
  379. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_bearer.py +0 -0
  380. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_common.py +0 -0
  381. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  382. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_factory.py +0 -0
  383. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_fingerprint.py +0 -0
  384. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_sapisidhash.py +0 -0
  385. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_transport_timeout.py +0 -0
  386. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  387. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  388. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  389. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  390. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/auth/strategies/test_factory.py +0 -0
  391. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/auth/strategies/test_strategies.py +0 -0
  392. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/auth/test_cookies.py +0 -0
  393. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/auth/test_verification.py +0 -0
  394. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/__init__.py +0 -0
  395. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_auth_list.py +0 -0
  396. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_character.py +0 -0
  397. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_character_create.py +0 -0
  398. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_data.py +0 -0
  399. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_image.py +0 -0
  400. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  401. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  402. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_image_upscale.py +0 -0
  403. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_models.py +0 -0
  404. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_run.py +0 -0
  405. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_scene.py +0 -0
  406. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_video.py +0 -0
  407. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_cli_video_chain.py +0 -0
  408. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_error_handling.py +0 -0
  409. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_helpers.py +0 -0
  410. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  411. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_settings_validation.py +0 -0
  412. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  413. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/composition/test_character.py +0 -0
  414. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/composition/test_compose_prompt.py +0 -0
  415. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/composition/test_handoff.py +0 -0
  416. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/composition/test_style_variants.py +0 -0
  417. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/composition/test_style_variants_e2e.py +0 -0
  418. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/conftest.py +0 -0
  419. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/__init__.py +0 -0
  420. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_chain_repo.py +0 -0
  421. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_find_incomplete_character.py +0 -0
  422. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_models.py +0 -0
  423. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_packaging.py +0 -0
  424. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_recorder.py +0 -0
  425. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_redaction.py +0 -0
  426. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_repository.py +0 -0
  427. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_scene_persistence.py +0 -0
  428. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_settings_and_errors.py +0 -0
  429. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/data/test_store_migrations.py +0 -0
  430. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/dev/test_recording_client.py +0 -0
  431. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/__init__.py +0 -0
  432. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/conftest.py +0 -0
  433. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  434. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  435. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_chain_e2e.py +0 -0
  436. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_character_create_e2e.py +0 -0
  437. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_daemon_e2e.py +0 -0
  438. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  439. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  440. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  441. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  442. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_json_output_e2e.py +0 -0
  443. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
  444. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  445. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_scene_compose_live.py +0 -0
  446. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_tools_e2e.py +0 -0
  447. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_transports_e2e.py +0 -0
  448. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  449. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  450. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/__init__.py +0 -0
  451. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/auth.feature +0 -0
  452. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/auth_login.feature +0 -0
  453. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/character_create.feature +0 -0
  454. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/character_read.feature +0 -0
  455. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/conftest.py +0 -0
  456. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/image.feature +0 -0
  457. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/image_upscale.feature +0 -0
  458. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/locale_picker_include.feature +0 -0
  459. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_auth_login_steps.py +0 -0
  460. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_auth_steps.py +0 -0
  461. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_character_create_steps.py +0 -0
  462. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_character_read_steps.py +0 -0
  463. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_image_steps.py +0 -0
  464. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_image_upscale_steps.py +0 -0
  465. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  466. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_step_collision_guard.py +0 -0
  467. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_video_agent_ui_steps.py +0 -0
  468. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/test_video_chain_steps.py +0 -0
  469. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/video_agent_ui.feature +0 -0
  470. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/features/video_chain.feature +0 -0
  471. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/fixtures/__init__.py +0 -0
  472. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/fixtures/seeded_catalog.py +0 -0
  473. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/image_batch/__init__.py +0 -0
  474. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/image_batch/test_image_manifest.py +0 -0
  475. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/image_batch/test_observability_events.py +0 -0
  476. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/integration/__init__.py +0 -0
  477. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/integration/conftest.py +0 -0
  478. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/integration/constants.py +0 -0
  479. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/integration/test_storage_gcs.py +0 -0
  480. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/integration/test_storage_s3.py +0 -0
  481. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/mcp/__init__.py +0 -0
  482. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/mcp/conftest.py +0 -0
  483. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/mcp/test_server.py +0 -0
  484. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/mcp/test_stdio_transport.py +0 -0
  485. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/mcp/test_tools_helpers.py +0 -0
  486. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  487. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  488. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/scripts/test_check_materiality.py +0 -0
  489. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  490. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/scripts/test_materiality_backtest.py +0 -0
  491. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/services/__init__.py +0 -0
  492. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/services/test_character_create_redaction.py +0 -0
  493. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/services/test_character_create_saga.py +0 -0
  494. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  495. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/smoke/__init__.py +0 -0
  496. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  497. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/smoke/test_real_flow.py +0 -0
  498. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_auth.py +0 -0
  499. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_browser_manager.py +0 -0
  500. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_chain.py +0 -0
  501. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_chain_manifest.py +0 -0
  502. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_cli_data.py +0 -0
  503. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_config.py +0 -0
  504. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_conftest_isolation.py +0 -0
  505. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_data_queries.py +0 -0
  506. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_documentation_gate.py +0 -0
  507. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_errors.py +0 -0
  508. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_errors_403.py +0 -0
  509. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_json_output.py +0 -0
  510. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_manifest.py +0 -0
  511. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_marker_registry.py +0 -0
  512. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_media.py +0 -0
  513. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_observability.py +0 -0
  514. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_paths.py +0 -0
  515. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_profile_store.py +0 -0
  516. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/test_smoke.py +0 -0
  517. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/__init__.py +0 -0
  518. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_banned.py +0 -0
  519. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_expander.py +0 -0
  520. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_invocation.py +0 -0
  521. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_loader.py +0 -0
  522. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_registry.py +0 -0
  523. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_runtime.py +0 -0
  524. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/tools/test_spec.py +0 -0
  525. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/ui/test_app.py +0 -0
  526. {gflow_cli-0.28.0 → gflow_cli-0.30.0}/tests/worker/test_daemon.py +0 -0
@@ -0,0 +1,78 @@
1
+ ---
2
+ description: Auto-fix lint and formatting, then report types and tests. Run before every commit.
3
+ ---
4
+
5
+ # `/gflow:check` — Quality gates
6
+
7
+ Run in order. Stop and report if a step fails after the fix pass.
8
+
9
+ ## Steps
10
+
11
+ These steps mirror the CI `test` job in `.github/workflows/ci.yml` **in the same order**. Any command that CI runs as a *verify* (`--check`) is run here as a verify too — see step 4.
12
+
13
+ **1. Repo hygiene + doc links** (read-only — CI runs both; a broken doc link fails CI)
14
+
15
+ ```bash
16
+ PYTHONUTF8=1 uv run python scripts/ci/check_repo_hygiene.py
17
+ PYTHONUTF8=1 uv run python scripts/ci/check_doc_links.py
18
+ ```
19
+
20
+ **2. Auto-fix lint and formatting** (rewrites files in place)
21
+
22
+ ```bash
23
+ uv run ruff check --fix src tests
24
+ uv run ruff format src tests
25
+ ```
26
+
27
+ Report which files were modified. **If this rewrote anything, those files are part of the change — stage them.** CI does not run the auto-fix; it runs the `--check` verify in step 4 against the *committed* tree, so an uncommitted reformat is a red CI build.
28
+
29
+ **3. Repeat lint/format ONLY on the files you touched? No — always run repo-wide.** The whole-tree `src tests` scope in step 2/4 is deliberate: a latent format failure in a file your change merely imports (e.g. a BDD step module) will fail CI even if your own edits are clean. Never narrow the scope to "just my files."
30
+
31
+ **4. Verify — the EXACT CI gate (non-mutating; must be clean before you commit/push)**
32
+
33
+ ```bash
34
+ uv run ruff check src tests
35
+ uv run ruff format --check src tests
36
+ ```
37
+
38
+ These are byte-for-byte what CI runs (`ci.yml` "Lint" + "Format check"). If `--check` exits non-zero here, step 2's rewrites are **uncommitted** — stage them and re-run. **Never push while this is red:** the test job dies at the format step *before* pytest, which also makes SonarCloud report `new_coverage=0%` (no coverage XML is produced). A green `/gflow:check` that skips this verify is how PR #269 shipped a format failure past an 8-agent council.
39
+
40
+ **5. Type check** (report only — cannot auto-fix)
41
+
42
+ ```bash
43
+ uv run pyright src
44
+ ```
45
+
46
+ **6. Tests + coverage** (report only)
47
+
48
+ ```bash
49
+ uv run python -m pytest -q --cov=gflow_cli --cov-fail-under=80
50
+ ```
51
+
52
+ ## Output
53
+
54
+ - List files changed by the fix pass (empty = nothing needed fixing)
55
+ - **Step 4 verify result — `ruff check` + `ruff format --check` both clean (this is the CI gate; a non-zero here is a blocking finding, not a warning)**
56
+ - All pyright errors with `file:line` references
57
+ - Pytest summary line and coverage percentage
58
+ - Final verdict: all gates pass / which gates failed
59
+
60
+ ## Notes
61
+
62
+ Ruff fix and format may rewrite multiple files. Always `git diff` before staging.
63
+ Pyright errors and test failures require manual intervention — do not attempt silent workarounds.
64
+ If the coverage run crashes the current MCP/sandbox session with `Connection closed`, re-run the
65
+ same marker-filtered suite in smaller chunks without coverage and rely on CI for the coverage XML.
66
+ Project pytest defaults already exclude `e2e` and `live`; those markers are explicit,
67
+ credit-spending gates and must be requested with a separate `-m e2e` / `-m live` command.
68
+
69
+ **Windows agent sessions:** `uv run pytest` is unreliable — invoke
70
+ `.venv/Scripts/python.exe -m pytest` directly, and prefix Python invocations with
71
+ `PYTHONUTF8=1` when output contains non-ASCII. The unscoped full-coverage sweep
72
+ (step 6) can OOM locally (exit 137 / SIGKILL): run the suites scoped to the dirs you
73
+ touched and trust CI for the full coverage gate — **a green full-suite CI run on the
74
+ same tree (e.g. the just-merged PR) satisfies step 6 for release purposes.**
75
+
76
+ The OOM allowance applies to step 6 (coverage) ONLY. Step 4 (`ruff check` + `ruff
77
+ format --check src tests`) is cheap, never OOMs, and must ALWAYS be run repo-wide
78
+ against the exact tree you are about to push — no scoping, no skipping.
@@ -8,8 +8,8 @@ Supported tools that auto-discover this file: Cursor, Codex, Aider, Jules, Devin
8
8
 
9
9
  - Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com`.
10
10
  - Python 3.11+ · `uv`-managed · `hatchling` builds · Playwright Chromium transport · `pyright` strict · `ruff` · `pytest`.
11
- - Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_character.py`, `cli_data.py`, `cli_image.py`, `cli_models.py`, `cli_run.py`, `cli_scene.py`, `cli_video.py`, `config.py`, `data/`, `errors.py`, `exceptions.py`, `image_batch.py`, `manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
12
- - Command surface: `gflow auth`, `gflow image` (t2i/i2i/upload), `gflow video` (t2v/i2v/r2v/batch/chain), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), and `gflow data` (catalog queries).
11
+ - Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `data/`, `mcp/`, `services/`, `tools/`, `ui/`, `worker/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_character.py`, `cli_data.py`, `cli_image.py`, `cli_instructions.py`, `cli_models.py`, `cli_movie.py`, `cli_run.py`, `cli_scene.py`, `cli_tools.py`, `cli_video.py`, `chain.py`, `chain_manifest.py`, `composition.py`, `config.py`, `errors.py`, `exceptions.py`, `image_batch.py`, `manifest.py`, `movie_manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
12
+ - Command surface: `gflow auth`, `gflow image` (t2i/i2i/batch/upload/upscale), `gflow video` (t2v/i2v/r2v/batch/chain), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), `gflow instructions` (persistent Agent-Mode brief cards — add/list/enable/disable/rm/apply/toggle-mode, credits-free, `--project` required), `gflow movie` (run/template — multi-scene manifest pipeline), `gflow tools` (list/show/run — prompt-rewriting tools, also `--tool` on generation commands), `gflow data` (catalog queries), `gflow models`, `gflow run`, `gflow mcp` (run/setup — stdio MCP server), and `gflow serve` (HTTP/SSE).
13
13
  - Requires a Google AI Ultra or Pro subscription with Flow access. All generations bill against the user's own Google account.
14
14
 
15
15
  ## Headed-browser dependency (architectural reality)
@@ -57,9 +57,9 @@ Or invoke the wrapper: `/gflow:check`.
57
57
 
58
58
  - Type hints everywhere; `pyright` strict on `src/gflow_cli`.
59
59
  - Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
60
- - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
60
+ - Errors as RFC 9457 Problem Details with stable per-class exit codes (3–25, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`, 25 `FlowAgentUiError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
61
61
  - 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
62
- - **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_server.py`.
62
+ - **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_cli_parity.py` (every CLI leaf command needs a mapped MCP tool or an explicit, reasoned exemption) plus the schema checks in `tests/mcp/test_server.py`.
63
63
 
64
64
  ## PR instructions
65
65
 
@@ -7,6 +7,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.30.0] — 2026-07-09
11
+
12
+ ### Added
13
+
14
+ - **MCP `gflow_generate_video` model/duration/count parameters (CLI↔MCP parity):** agents can now select the Veo model (`veo_lite`/`veo_fast`/`veo_quality`/`omni_flash`, aliases accepted), clip duration, and batch count through MCP, matching the CLI `gflow video` flags. An unknown model is rejected up front with a 400 instead of failing deep in the worker; an omitted model still lets the transport apply its i2v veo-lite default (issue #125). Co-authored-by C1ph3r404 (from the closed PR #258). Note: the pre-existing transport-level i2v veo-lite default already protected the MCP path, so this is parity + agent control, not a new credit guard.
15
+
16
+ ### Fixed
17
+
18
+ - **Character-create recorder no longer crashes on a duplicated `flow_media_id`.** Under the agentic cohort the classic character-editor slot-add control is absent, so the body prompt lands in the still-active face slot and both slots report the same `flow_media_id`; `_record_character_local_files` minted a fresh asset `id` per slot and the second slot violated `UNIQUE(profile_name, flow_media_id)` → `DataIntegrityError`. The recorder now reuses the existing asset id (mirroring `record_completed_video`), making character local-file recording idempotent on the business key. Regression test in `tests/data/test_recorder_character.py`.
19
+ - **`prefer_classic` no longer logs a misleading `WARNING` on the agentic cohort.** The server-gated agentic (`tune`) cohort cannot be exited client-side, and `prefer_classic` is best-effort by contract, so `get_ui_driver` now logs that expected fall-through at `INFO` (`ui_driver.prefer_classic.cohort_natively_agentic`) and reserves `WARNING` for genuinely unexpected exit failures.
20
+
21
+ ## [0.29.0] — 2026-07-09
22
+
23
+ ### Added
24
+
25
+ - **Persistent `gflow instructions` command group:** CRUD over project brief cards (add, list, enable, disable, rm, apply, toggle-mode) with title/ID selection, master toggle, and REST upload support for card reference images. Live-verified credit-free end-to-end (see `docs/LIVE_VERIFICATION_v0.29.0.md`).
26
+ - **Declarative full-sync:** `gflow instructions apply FILE` for idempotent sync of instructions from TOML or JSON brief files.
27
+ - **Movie manifest instructions integration:** Global `[instructions]` and per-scene `[scenes.instructions]` blocks in `movie.toml` to dynamically sync project brief cards before generating clips (per-scene re-sync memoized via `_BriefSyncCache`; documented as a destructive full-sync).
28
+ - **`gflow_instructions_*` MCP tools:** six new tools (`list`, `add`, `set_enabled`, `rm`, `toggle_mode`, `apply`) giving MCP agents the full instructions CRUD surface — thin adapters over the same live-verified brief primitives, credits-free, RFC 9457 error envelopes. `gflow_list_tools` and the new tools are now documented in `docs/MCP.md`. Note: `gflow_generate_video` deliberately has no `instructions` param (the video pipeline has no instructions support — documented asymmetry).
29
+ - **MCP↔CLI parity contract enforced in CI:** `tests/mcp/test_cli_parity.py` walks every CLI leaf command and fails when one has neither a mapped MCP tool nor an explicit, reasoned exemption.
30
+
31
+ ### Changed
32
+
33
+ - **Agentic-indicator selectors consolidated:** the 4 agentic cohort ligature probes are now canonical in `drivers/factory.py` (`AGENTIC_INDICATOR_SELECTORS`, `AGENT_TUNE_INDICATOR_SELECTOR`); both UI transports import them instead of carrying drift-prone copies, locked by a new symmetry test.
34
+
35
+ ### Internal
36
+
37
+ - **`/gflow:check` and the PR council are now CI-faithful:** the check gate runs the exact CI verify commands (`ruff format --check`), the council pre-flight gained a D0 mechanical CI gate that hard-blocks on a red run, and `check_doc_links.py` joined CI — closing the gap that let a format failure ship past an 8-agent council review.
38
+
10
39
  ## [0.28.0] — 2026-07-08
11
40
 
12
41
  ### Added
@@ -1869,7 +1898,9 @@ shell-script template that branches on these codes.
1869
1898
 
1870
1899
  First skeleton. Not functional end-to-end yet.
1871
1900
 
1872
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.28.0...HEAD
1901
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.30.0...HEAD
1902
+ [0.30.0]: https://github.com/ffroliva/gflow-cli/compare/v0.29.0...v0.30.0
1903
+ [0.29.0]: https://github.com/ffroliva/gflow-cli/compare/v0.28.0...v0.29.0
1873
1904
  [0.28.0]: https://github.com/ffroliva/gflow-cli/compare/v0.27.1...v0.28.0
1874
1905
  [0.27.1]: https://github.com/ffroliva/gflow-cli/compare/v0.27.0...v0.27.1
1875
1906
  [0.27.0]: https://github.com/ffroliva/gflow-cli/compare/v0.26.0...v0.27.0
@@ -0,0 +1,37 @@
1
+ # GEMINI.md
2
+
3
+ > Project memory hub for **Gemini CLI**. The universal coding-agent rules for any tool (Cursor, Codex, Aider, Gemini CLI, etc.) live in [AGENTS.md](AGENTS.md) — this file carries Gemini-specific session protocol only.
4
+
5
+ ## What this project is
6
+
7
+ `gflow-cli` is an unofficial Python CLI that drives [Google Flow](https://labs.google/fx/tools/flow) (Veo image-to-video, Imagen text-to-image) from the terminal by reverse-engineering Flow's private REST API. See [README.md](README.md) for the user-facing overview.
8
+
9
+ ## On every session start
10
+
11
+ 1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
12
+ 2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
13
+ 3. Pull deeper context on demand (type as plain text in the `agy` TUI prompt):
14
+ - Current task / where we left off → `gflow:status`
15
+ - Starting a new feature → `gflow:predict` → `gflow:scenario` → `gflow:plan <feature>`
16
+ - Touching auth or reCAPTCHA → `gflow:known-issues`
17
+ - Cutting a release → `gflow:release`
18
+ - Before any commit → `gflow:check`
19
+
20
+ ## Gemini-specific
21
+
22
+ - Use specialized skills when relevant (e.g., `find-docs` for library research, `pr-council-review` for PR audits).
23
+ - Maintain memory via the `mcp-mempalace` tool if available.
24
+ - Prioritize **turn efficiency** and **high-signal output**.
25
+
26
+ ## Active phase
27
+
28
+ - **v0.29.0 shipped (2026-07-09):** persistent `gflow instructions` CRUD + movie-manifest instructions brief-sync + six `gflow_instructions_*` MCP tools, with a CI-enforced MCP↔CLI parity contract (`tests/mcp/test_cli_parity.py`) and the agentic-indicator selectors consolidated onto `drivers/factory.py`. Released to PyPI; issue #192 closed.
29
+ - **PR #258 (Camoufox stealth engine, external contribution) — taken over and CLOSED-OUT (2026-07-09).** A 5-persona `/gflow:predict` rejected a rebase in favour of a decomposed, evidence-gated series: Phase 1 landed the MCP video param parity (#273, contributor-credited); a WAF-evidence harness (#274/#275) measured a **0.0% WAF 403 rate over 20 live generations**, so per ADR-13 the Camoufox engine was **NOT built** (#276). The i2i "UUID-ref bug" was investigated and found not-a-bug (#277, stale comment fixed). Contributor thanked + credited on the closed PR. Evidence: `docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md`.
30
+ - **Decoupled Daemon/Worker Plan:** The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). The remaining headless SSE Daemon + Tauri/React editor blueprint is scheduled in [gflow-studio-scaffold/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md) and [rest-api-layer/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md).
31
+ - **Core Lesson (Retrospective):**
32
+ - **Verify before adopting — measure, don't assume.** The PR #258 takeover's value was checking every claim against the real code and real data instead of adopting on assertion: a stealth engine we didn't build (0% WAF baseline), a "credit guard" already enforced one layer down, a `display_name` already shipped in v0.26.0, an i2i "bug" that wasn't one, and a concurrency bug that never merged. Five claims, five dismissals — the cheapest correct outcome came from investigation, not implementation.
33
+ - **ADR gates pay for themselves.** ADR-13 ("confirm the current stealth fix insufficient before implementing an alternative") turned a "build Camoufox" epic into a one-afternoon 20-generation spike that said "don't." Encode the gate as a runnable measurement (`scripts/spike_waf_camoufox.py`), not a debate.
34
+ - **Decompose contested external PRs; never rebase a branch that's 60+ commits behind.** Cherry-pick/re-express the genuinely-valuable pieces onto fresh branches with `Co-authored-by` credit, evidence-gate the risky parts, and split by concern — one PR per slice.
35
+ - Kept `gflow-cli` strictly headless (Uvicorn + FastMCP over localhost HTTP/SSE); browser-context locks bypassed by serializing task writes in the SQLite queue with WAL-mode parallel reads. Relational instruction cards must be phrased conversationally (imperative prompts bypass the brief); multi-scene movie sync is read-modify-write to preserve server-assigned card IDs.
36
+
37
+ See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.28.0
3
+ Version: 0.30.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
@@ -63,7 +63,7 @@ Provides-Extra: gcs
63
63
  Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
64
64
  Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
65
65
  Provides-Extra: patchright
66
- Requires-Dist: patchright==1.60.1; extra == 'patchright'
66
+ Requires-Dist: patchright==1.61.2; extra == 'patchright'
67
67
  Provides-Extra: s3
68
68
  Requires-Dist: s3fs>=2024.2.0; extra == 's3'
69
69
  Requires-Dist: universal-pathlib>=0.2.5; extra == 's3'
@@ -147,6 +147,7 @@ Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1
147
147
  | 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
148
148
  | **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
149
149
  | 🎭 **Characters** | [Characters](docs/CHARACTER.md), reusable subjects (`gflow character`) |
150
+ | 🤖 **Agentic & automation** | [Instructions](docs/INSTRUCTIONS.md) (`gflow instructions`, persistent brief cards) · [Movie](docs/MOVIE.md) (`gflow movie`, multi-scene manifests) · [Tools](docs/TOOLS.md) (`--tool`, prompt rewriting) · [MCP server](docs/MCP.md) (`gflow mcp run` / `gflow serve`) |
150
151
  | 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
151
152
  | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
152
153
  | 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
@@ -154,7 +155,7 @@ Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1
154
155
 
155
156
  ## For AI agents & LLMs
156
157
 
157
- gflow-cli ships three agent entry points. Pick the one your tool reads first.
158
+ gflow-cli ships four agent entry points. Pick the one your tool reads first.
158
159
 
159
160
  | File | Audience | Tools |
160
161
  |---|---|---|
@@ -185,7 +186,7 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
185
186
 
186
187
  ## Project status
187
188
 
188
- **Alpha.** Image (t2i, i2i, upload) and video (t2v, i2v, r2v) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Recent additions: `gflow character` for reusable subjects, `gflow scene` for credit-free server-side stitching, and `gflow video chain` for linked clips. Video `batch` is still queued for Phase B, so use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)).
189
+ **Alpha.** Image (t2i, i2i, upload, upscale, batch) and video (t2v, i2v, r2v, batch, chain) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Beyond single generations: `gflow movie` renders multi-scene manifests, `gflow instructions` manages persistent Agent-Mode brief cards (credits-free), `gflow character` handles reusable subjects, `gflow scene` does credit-free server-side stitching, `--tool` applies prompt-rewriting tools, and an MCP server (`gflow mcp run` stdio / `gflow serve` HTTP-SSE) exposes the core surface to AI agents with a CI-enforced CLI↔MCP parity contract.
189
190
 
190
191
  Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project is heading: [ROADMAP.md](ROADMAP.md).
191
192
 
@@ -653,6 +653,8 @@ Records image, batch, T2V, I2V, and R2V provenance in a local SQLite catalog. Re
653
653
 
654
654
  **Status:** NOT implemented. Parked until the stealth-flag fix (`--disable-blink-features=AutomationControlled` + init script) is confirmed insufficient, or until a contributor picks it up.
655
655
 
656
+ **2026-07-09 verification — the current stealth fix is CONFIRMED SUFFICIENT (so this stays parked).** A 20-generation baseline on a live authed profile through the default stealth stack produced a **0.0% WAF 403 rate** (19/20 success; the one miss was a UI-scrape timeout, not a WAF block). This met ADR-13's "must verify before implementing" gate and closed the [Camoufox adoption roadmap](superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md) at Phase 2 — the Camoufox engine was NOT built. Evidence: [superpowers/spikes/2026-07-09-camoufox-waf-403.md](superpowers/spikes/2026-07-09-camoufox-waf-403.md). Re-run `scripts/spike_waf_camoufox.py` if a repeatable WAF-403 is later observed; a materially non-zero rate would reopen CDP-Attach / Camoufox.
657
+
656
658
  ---
657
659
 
658
660
  ### Phase 8 — Pluggable storage backend — BACKLOG
@@ -699,7 +701,7 @@ Today the CLI writes media to `$GFLOW_CLI_OUTPUT_DIR` on the local filesystem. P
699
701
  | 10 | Both `gflow` and `flow` binary names installed | `flow` is friendlier; `gflow` avoids conflicts with Facebook Flow / MS Power Automate |
700
702
  | 11 | LF-only line endings via `.gitattributes` | Single repo source of truth; cross-platform contributors don't think about it |
701
703
  | 12 | `Provider` indirection (legacy `providers/`) removed | Superseded by `api.FlowApiClient`. Re-introduce when we add `OfficialVeoProvider` (planned v0.5+) |
702
- | 13 | CDP attach transport deferred | Must first confirm whether CDP-attached Chrome still sets `navigator.webdriver=true` (which would negate any reCAPTCHA advantage over the current stealth fix). See CDP Attach backlog entry. |
704
+ | 13 | CDP attach / stealth-engine alternatives deferred; **current stealth fix confirmed sufficient 2026-07-09** | Gate met: a 20-gen live baseline through the default stealth stack showed a **0.0% WAF 403 rate**, so the "confirm insufficient before implementing" bar is unmet — CDP-Attach and the Camoufox engine stay parked (Camoufox roadmap closed at Phase 2). Evidence: [superpowers/spikes/2026-07-09-camoufox-waf-403.md](superpowers/spikes/2026-07-09-camoufox-waf-403.md). |
703
705
  | 14 | HTTP status path (`get_video_status`) retired alongside `generate_video` | It is the same 401-dead path and would collide with the new `api/video.py:VideoStatus` value object — retiring both together keeps the domain clean. |
704
706
 
705
707
  ---
@@ -76,6 +76,7 @@ Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1
76
76
  | 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
77
77
  | **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
78
78
  | 🎭 **Characters** | [Characters](docs/CHARACTER.md), reusable subjects (`gflow character`) |
79
+ | 🤖 **Agentic & automation** | [Instructions](docs/INSTRUCTIONS.md) (`gflow instructions`, persistent brief cards) · [Movie](docs/MOVIE.md) (`gflow movie`, multi-scene manifests) · [Tools](docs/TOOLS.md) (`--tool`, prompt rewriting) · [MCP server](docs/MCP.md) (`gflow mcp run` / `gflow serve`) |
79
80
  | 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
80
81
  | 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
81
82
  | 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
@@ -83,7 +84,7 @@ Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1
83
84
 
84
85
  ## For AI agents & LLMs
85
86
 
86
- gflow-cli ships three agent entry points. Pick the one your tool reads first.
87
+ gflow-cli ships four agent entry points. Pick the one your tool reads first.
87
88
 
88
89
  | File | Audience | Tools |
89
90
  |---|---|---|
@@ -114,7 +115,7 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
114
115
 
115
116
  ## Project status
116
117
 
117
- **Alpha.** Image (t2i, i2i, upload) and video (t2v, i2v, r2v) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Recent additions: `gflow character` for reusable subjects, `gflow scene` for credit-free server-side stitching, and `gflow video chain` for linked clips. Video `batch` is still queued for Phase B, so use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)).
118
+ **Alpha.** Image (t2i, i2i, upload, upscale, batch) and video (t2v, i2v, r2v, batch, chain) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Beyond single generations: `gflow movie` renders multi-scene manifests, `gflow instructions` manages persistent Agent-Mode brief cards (credits-free), `gflow character` handles reusable subjects, `gflow scene` does credit-free server-side stitching, `--tool` applies prompt-rewriting tools, and an MCP server (`gflow mcp run` stdio / `gflow serve` HTTP-SSE) exposes the core surface to AI agents with a CI-enforced CLI↔MCP parity contract.
118
119
 
119
120
  Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project is heading: [ROADMAP.md](ROADMAP.md).
120
121
 
@@ -38,7 +38,8 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
38
38
  | **[docs/CHARACTER.md](CHARACTER.md)** | Characters feature spec & system design: domain model, endpoint/cost matrix, sequence diagrams, JSON payloads (I/O), CLI surface, reuse via `referenceEntities` (#145) | Working on `gflow character`, reusing a character in generations, or understanding Flow's character wire protocol |
39
39
  | **[docs/MOVIE.md](MOVIE.md)** | `gflow movie` — multi-scene character-consistent films: manifest format, run lifecycle (browser stays open through generate→poll→download), entity-attach mechanism (Personagens right-click), resume/handoff, credits | Working on `gflow movie`, debugging scene generation, or understanding the character-entity attach + consistency model |
40
40
  | **[docs/TOOLS.md](TOOLS.md)** | Tools framework: the `gflow tools list/show/run` group, the `--tool/-t` option on generation commands, the TOML tool schema, how a tool is defined, "My Tools" user-authored tools, MCP exposure + §61 parity | Working on `gflow_cli.tools`, adding a built-in or user tool, or wiring `--tool` into a command |
41
- | **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (HTTP/SSE), the tools/prompts/resources surface, CLI↔MCP §61 parity, security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/SSE transports |
41
+ | **[docs/INSTRUCTIONS.md](INSTRUCTIONS.md)** | Agent Instructions: project-brief cards for Flow's Agent Mode — the mechanism (enabled cards steer generation via the reasoning path), ephemeral `-i` vs persistent cards, the `gflow instructions` CRUD surface with the single generic `--ref` (image **or** character), and the 3-layer pipeline | Working on `-i`/agent instructions, the `gflow instructions` group, or understanding how the project brief anchors generations |
42
+ | **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (HTTP/SSE), the tools/prompts/resources surface, the CLI↔MCP parity contract (AGENTS.md "MCP & CLI Schema Symmetry", enforced by `tests/mcp/test_cli_parity.py`), security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/SSE transports |
42
43
  | **[docs/PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)** | The `creative-director` tool: 5-component formula, 15 domain styles, banned-keyword policy, Gemini endpoint + I/O, never-fatal contract, `expanded_prompt` + `metadata_json.tool` provenance/redaction, config | Using or debugging `--tool creative-director`, editing the tool TOML, or auditing recorded prompt provenance |
43
44
  | **[docs/IMAGE_UPSCALE_RECON.md](IMAGE_UPSCALE_RECON.md)** | `gflow image upscale` wire protocol: `upsampleImage` endpoint, full clientContext (projectId/sessionId/tool/userPaygateTier), reCAPTCHA action `IMAGE_GENERATION`, inline base64 response, 4K Ultra-gating, REST-is-dead proof | Working on `gflow image upscale`, debugging the 403/reCAPTCHA path, or understanding Flow's image-upscale wire protocol (#171) |
44
45
  | **[docs/AGENT_UI_RECON.md](AGENT_UI_RECON.md)** | Agentic Flow UI cohort: classic-vs-agentic DOM signature, server-side + volatile (flapping) A/B gating (no client-readable flag), why `_exit_agent_mode` fails, runtime-DOM-detection recommendation | Touching `_exit_agent_mode` / composer mode-switch, diagnosing exit 23 selector drift, or understanding Flow's agentic-UI A/B (#183/#174) |
@@ -82,6 +83,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
82
83
  **"How do I create a reusable character (face + body) I can reuse across generations?"** → [USAGE § `gflow character`](USAGE.md#gflow-character) · design: [CHARACTER](CHARACTER.md)
83
84
  **"How do I turn a terse prompt into a vivid one before generating?"** → `--tool creative-director:style=cinema` on any generation command — see [PROMPT_EXPANSION](PROMPT_EXPANSION.md) · framework: [TOOLS](TOOLS.md)
84
85
  **"What tools are available and what styles do they support?"** → run `gflow tools list` / `gflow tools show creative-director` — see [TOOLS](TOOLS.md)
86
+ **"How do I make Flow's agent follow a style/reference across a project's generations?"** → agent instruction cards — ephemeral `-i "text"` (shipped) or the persistent `gflow instructions` group with a generic `--ref` (image or character), see [INSTRUCTIONS](INSTRUCTIONS.md)
85
87
  **"What preset voices can a character use?"** → run `gflow character voices` — see [USAGE § `gflow character voices`](USAGE.md#gflow-character-voices)
86
88
  **"My batch died with exit code 3 (auth) — what now?"** → [USER_GUIDE § Journey 7](USER_GUIDE.md#journey-7--recovering-from-an-authexpirederror-mid-batch)
87
89
  **"Exit code 4 (rate-limit) or 5 (content-policy) — how do I recover?"** → [USER_GUIDE § Journey 12](USER_GUIDE.md#journey-12--recovering-from-contentpolicyerror-or-ratelimiterror)
@@ -120,7 +122,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
120
122
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
121
123
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
122
124
  **"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
123
- **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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)
125
+ **"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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)
124
126
  **"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.
125
127
  **"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)
126
128
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -0,0 +1,169 @@
1
+ # Agent Instructions — project brief cards for Google Flow's Agent Mode
2
+
3
+ > **Status.** The ephemeral `-i / --instruction` flag on `gflow image t2i` / `i2i`
4
+ > shipped in **v0.28.0** (live-verified). The persistent `gflow instructions`
5
+ > command group, the `movie.toml` instructions blocks, and the matching
6
+ > `gflow_instructions_*` MCP tools described here shipped in **v0.29.0**
7
+ > (live-verified, credit-free) — this doc now doubles as their spec and reference.
8
+
9
+ ## What an instruction card is
10
+
11
+ In Google Flow's **Agent Mode**, each project carries a **brief** — a set of
12
+ **instruction cards** the agent consults every time it generates. Each card has:
13
+
14
+ - a **title** (human label),
15
+ - a **guideline text** (e.g. _"Every image is a flat 2D children's crayon drawing on textured paper"_),
16
+ - zero or more **references** — an attached **image** _or_ a **character** entity,
17
+ - an **enabled** toggle.
18
+
19
+ Setting up cards is **credits-free** — it's a `PATCH` to the project brief, not a
20
+ generation. Credits are only spent when you actually generate.
21
+
22
+ ### How cards steer generation (mechanism)
23
+
24
+ Instruction cards apply **only on agentic-cohort sessions**, and only through the
25
+ agent's **reasoning path**: when you make a natural-language request, the agent
26
+ rewrites the image prompt to fold in every **enabled** card (live-verified — an
27
+ enabled "crayon drawing" card turned a style-neutral _"a red bicycle"_ prompt into
28
+ a crayon bicycle; an attached crayon **reference image** did the same). A card
29
+ with `enabled = false` stays in the brief but is ignored. On a classic-cohort
30
+ session, cards do not apply and `gflow` warns.
31
+
32
+ ## The three-layer pipeline
33
+
34
+ ```
35
+ 1. SET UP project context → gflow instructions add / apply (credits-free)
36
+ 2. GENERATE using that context → gflow image t2i / i2i --project <id>
37
+ 3. COMPOSE per-scene context → movie.toml [[…instructions.card]]
38
+ ```
39
+
40
+ **Agents: always set up the brief (layer 1) before generating (layer 2).** The
41
+ brief is what makes generations consistent across a project.
42
+
43
+ ## Ephemeral `-i` vs persistent cards
44
+
45
+ | | `-i "text"` | `gflow instructions` |
46
+ |---|---|---|
47
+ | Scope | one generation | persists on the project brief |
48
+ | Creates | a fresh enabled text-only card each call | managed cards you can toggle/remove/re-sync |
49
+ | References | text only | image **or** character references |
50
+ | Lookup | never — always creates | by **title** (case-insensitive, fail-fast on ambiguity) |
51
+
52
+ ```bash
53
+ # Ephemeral: a one-off enabled text card for this generation only.
54
+ gflow image t2i "a cat on a chair" -i "flat 2D children's crayon drawing"
55
+ ```
56
+
57
+ ## `gflow instructions` command surface
58
+
59
+ Persistent CRUD over a project's brief cards. Cards are selected by **title**
60
+ (case-insensitive, fail-fast on ambiguity) — the ergonomic default — or by the
61
+ stable server **`--id`** for the ambiguous-title / scripting case (`list --json`
62
+ surfaces ids). Mirrors `gflow character` (select by `--name` or `--entity-id`).
63
+
64
+ ```bash
65
+ gflow instructions add TITLE --text TEXT [--ref REF]... --project ID [--disabled]
66
+ gflow instructions list --project ID [--json]
67
+ gflow instructions enable (TITLE | --id ID) --project ID
68
+ gflow instructions disable (TITLE | --id ID) --project ID
69
+ gflow instructions rm (TITLE | --id ID) --project ID
70
+ gflow instructions apply FILE --project ID # declarative full-sync (TOML/JSON)
71
+ gflow instructions toggle-mode (--on | --off) --project ID
72
+ ```
73
+
74
+ ### The generic `--ref` (one attribute for all reference types)
75
+
76
+ Flow's card reference picker has **All / Images / Characters** tabs — a reference
77
+ is an **image** or a **character**, and both are ultimately a `referenceId`. So
78
+ there is **one** `--ref` option (repeatable), not separate `--ref-image` /
79
+ `--ref-character` flags. `gflow` classifies each value and routes it to the right
80
+ wire field:
81
+
82
+ | `--ref` value | Resolves to |
83
+ |---|---|
84
+ | local image path (`./hero.png`) | **upload via REST** (`uploadImage`) → media id → `imageReferenceMediaIds` |
85
+ | generated-image UUID | `imageReferenceMediaIds` |
86
+ | character id or name | `characterReferenceEntityNames` |
87
+
88
+ > **Uploading a new image to an instruction.** Flow's reference picker has an
89
+ > **"Upload media"** button — a card reference can be a brand-new local image, not
90
+ > just an existing project asset. `--ref ./local.png` covers this using the same
91
+ > **REST upload path** as `gflow image upload` (verified: upload → PATCH the card
92
+ > with the returned media id → the image renders as the card's reference). No UI
93
+ > automation of the picker's upload button is required.
94
+
95
+ ```bash
96
+ # A persistent card that anchors style to a reference image AND a character.
97
+ gflow instructions add "Hero look" \
98
+ --text "Match the reference image's art style; keep the hero on-model" \
99
+ --ref ./refs/mood.png \
100
+ --ref hero-character \
101
+ --project 6b714c4e-...
102
+ ```
103
+
104
+ ### `--project` semantics
105
+
106
+ `gflow instructions` and generation commands take `--project <id>` to target a
107
+ specific project's brief. Generation with `--project` uses that project's **active**
108
+ (enabled) cards. Without `--project`, generation creates a scratch project (so
109
+ persistent cards only make sense with `--project`).
110
+
111
+ ### `apply FILE` — declarative sync
112
+
113
+ `gflow instructions apply` replaces the project's cards with the file's contents
114
+ (idempotent full-sync), so a brief can live in version control:
115
+
116
+ ```toml
117
+ # brief.toml
118
+ [[card]]
119
+ title = "Cinematic lighting"
120
+ text = "Volumetric cinematic light from camera-left"
121
+ ref = ["./refs/mood.jpg"]
122
+ enabled = true
123
+
124
+ [[card]]
125
+ title = "Hero"
126
+ text = "Keep the hero on-model"
127
+ ref = ["hero-character"]
128
+ ```
129
+
130
+ ## Design notes (state, ids, persistence)
131
+
132
+ - **The server is the source of truth.** The brief lives in the project's
133
+ `agentInfo` (read via `flow.projectInitialData`, written via `PATCH agentInfo`).
134
+ The web UI can edit cards out-of-band, so every `list`/`enable`/`disable`/`rm`
135
+ reads the cards **live** — gflow never caches card state locally (a cache would
136
+ silently drift).
137
+ - **Card ids are stable and preserved.** Each card carries a server `id`. Mutating
138
+ commands are **read-modify-write** — read the current cards, change one, PATCH the
139
+ set back **keeping every card's existing id** (so `--id` stays valid and
140
+ `enable`/`disable`/`rm` edit *the same* card rather than replacing it).
141
+ - **The local database records provenance, not state.** When a generation runs with
142
+ instructions active, the operation record notes which cards/refs were used (like
143
+ it already records prompt, refs, and `--tool`) — for history/repro only. It is
144
+ never read to drive `gflow instructions`.
145
+ - **Declarative intent lives in the file.** For `apply brief.toml`, the
146
+ version-controlled TOML is the durable copy — not the database.
147
+
148
+ ## Typical agent-driven workflow (machine-readable)
149
+
150
+ 1. Discover/choose a project id (`gflow instructions list` needs `--project`; find
151
+ it in the Flow editor URL `…/project/<id>/…`).
152
+ 2. `gflow instructions apply brief.toml --project <id>` — set up the brief (free).
153
+ 3. `gflow image t2i "…" --project <id>` — generate using the active cards.
154
+ 4. Adjust: `gflow instructions disable "Cinematic lighting" --project <id>`, regenerate.
155
+ 5. `movie.toml` per-scene overrides for multi-scene consistency.
156
+
157
+ **DO NOT** rely on `-i` for anything you want to reuse — it's per-generation.
158
+ **PREFER** title selection; fall back to `--id` (from `list --json`) only when a
159
+ title is ambiguous.
160
+ **DO** set up the brief before generating; cards only apply on agentic sessions.
161
+
162
+ ## See also
163
+
164
+ - [USAGE.md](USAGE.md) — full command reference.
165
+ - [MOVIE.md](MOVIE.md) — multi-scene movies (`[[…instructions.card]]` blocks).
166
+ - [MCP.md](MCP.md) — the six `gflow_instructions_*` MCP tools mirroring this command group.
167
+ - [LIVE_VERIFICATION_v0.29.0.md](LIVE_VERIFICATION_v0.29.0.md) — live e2e evidence for the
168
+ CRUD surface (mechanism, H4 image-reference confirmation). The original plan + spike
169
+ findings were consolidated and removed when the feature shipped (v0.29.0 release prep).
@@ -0,0 +1,89 @@
1
+ # Live Verification — v0.29.0
2
+
3
+ Release date: 2026-07-09. Headline: **persistent `gflow instructions` CRUD + movie-manifest
4
+ instructions + `gflow_instructions_*` MCP parity tools** (PRs #269, #270, #271).
5
+
6
+ Verification run: 2026-07-09, live Flow against profile `ffroliva` (agentic cohort), Windows,
7
+ `.venv` build of the release tree. **Credit-free:** brief CRUD is a PATCH (no generation);
8
+ the single image generated to mint a fresh project is Imagen (no Veo credits).
9
+
10
+ ## Scope
11
+
12
+ | Change | Surface | Verdict |
13
+ |---|---|---|
14
+ | `instructions add` (text card + `--ref <image-UUID>` card) | `cli_instructions.py` | ✅ Live: both cards on server brief |
15
+ | `instructions list --json` (live server read) | `cli_instructions.py` | ✅ Live: 3 snapshots, stable shape |
16
+ | `instructions enable` / `disable` (title selection) | `cli_instructions.py` | ✅ Live: exit 0, state flips |
17
+ | `instructions toggle-mode --off/--on` (master switch) | `cli_instructions.py` | ✅ Live: exit 0 both directions |
18
+ | `instructions apply` (TOML full-sync, destructive) | `cli_instructions.py` | ✅ Live: brief replaced, `enabled=false` honored |
19
+ | `instructions rm` (read-modify-write, id preserved) | `cli_instructions.py` | ✅ Live: card dropped, sibling id stable |
20
+ | `gflow_instructions_*` MCP tools (6) | `mcp/tools.py` | ✅ Unit tests (13, fake client) — thin adapters over the SAME `get_agent_info`/`patch_agent_info` primitives live-verified above |
21
+ | MCP↔CLI parity contract | `tests/mcp/test_cli_parity.py` | ✅ CI-enforced (45 CLI leaves, all decided) |
22
+ | Agentic-indicator selector consolidation | `drivers/factory.py` | ✅ Symmetry tests + full suite green |
23
+ | Movie `[instructions]` / `[scene.instructions]` brief-sync | `movie_manifest.py` / `cli_movie.py` | ⚠️ Code-path-verified (see below) |
24
+
25
+ ## Live scenario
26
+
27
+ Fresh project `9d7b750f-b4a8-4c2f-b5b0-a059cbfbae73` minted via one credit-free t2i
28
+ (`"a single red apple on a white table, studio lighting"`, NARWHAL, portrait), producing media
29
+ `886f0d6c-1baa-460c-a2a0-5a5a463f5ae6`. Then the full CRUD sequence (11 commands, each its own
30
+ browser session, all exit 0):
31
+
32
+ 1. `add "Crayon style" --text …` → text card created.
33
+ 2. `add "Mood ref" --text … --ref 886f0d6c-…` → **the generated image's UUID attached as
34
+ `image_media_ids` on the card** (H4 reference path, previously untested live).
35
+ 3. `list --json` → both cards present, master `enabled=true`.
36
+ 4. `disable "Crayon style"` / 5. `enable "Crayon style"` → title selection round-trip.
37
+ 6. `toggle-mode --off` / 7. `toggle-mode --on` → master switch both directions.
38
+ 8. `apply brief.toml` → **full-sync replaced** the brief with `Palette rule` (enabled) +
39
+ `Framing rule` (`enabled = false` from TOML honored on the server).
40
+ 9. `list --json` → exactly the 2 applied cards, prior cards gone (destructive sync confirmed).
41
+ 10. `rm "Palette rule"` → card removed.
42
+ 11. `list --json` → only `Framing rule` remains, **same server id `efbb029c…` as in snapshot 9**
43
+ — read-modify-write preserves card ids across mutations.
44
+
45
+ ## Evidence ledger (5-layer)
46
+
47
+ 1. **File count:** exactly one image file written (`886f0d6c-…_1.jpg`, 408,791 bytes).
48
+ 2. **Magic bytes:** `FF D8 FF E0` (JPEG/JFIF).
49
+ 3. **Dimensions:** 768×1376 valid portrait render (PIL-confirmed).
50
+ 4. **Structlog invariants:** `ui_driver.bound mode=agentic` on project entry; 11/11 command
51
+ exits 0; zero `level=error` events across the run; three parseable
52
+ `"command": "instructions list"` JSON payloads with consistent card shape.
53
+ 5. **User-confirmable artifact:** open
54
+ <https://labs.google/fx/en/tools/flow/project/9d7b750f-b4a8-4c2f-b5b0-a059cbfbae73> —
55
+ the brief shows exactly one card, **"Framing rule"**, disabled, matching snapshot 11.
56
+
57
+ ## Movie brief-sync — code-path-verified (deliberate, no credits spent)
58
+
59
+ `movie run`'s per-scene brief sync (`_BriefSyncCache` full-sync) drives the **same**
60
+ `get_agent_info` → build cards → `patch_agent_info` primitives exercised live above (steps 8–9
61
+ are exactly its full-sync semantics). A true end-to-end check requires generating clips (Veo
62
+ credits); the user chose to defer it this cycle. Unit + BDD suites cover the manifest parsing,
63
+ memoization, and re-sync logic.
64
+
65
+ ## Gates
66
+
67
+ Local: `ruff check` 0 errors · `ruff format --check` clean · `pyright src` 0 errors ·
68
+ hygiene + doc-links clean · full suite 2137 passed. CI on develop merge commits
69
+ `a0ca311`/`0cc1051`/`ee47c00` (PRs #270/#271/#269): tests (3.11/3.12/3.13) + **SonarCloud
70
+ quality gate** all green.
71
+
72
+ `/gflow:doc-review`: mechanical checks 1–7 PASS (PROJECT_STATUS.md was stale at v0.27.1 —
73
+ updated). Council verdict: **YELLOW across all 3 auditors, zero release-blockers**.
74
+ 14 distinct findings; all Tier 1/Tier 2 fixed in the release-prep commit (README/AGENTS/
75
+ llms.txt entry points now surface instructions/movie/MCP; `[scenes.instructions]` key name;
76
+ SKILL.md `--project` required; MCP.md image-tool `instructions` param; AGENTS.md exit-code
77
+ range 3–25; INDEX §61 dead ref; INSTRUCTIONS.md status pinned to v0.29.0 + orphaned plan
78
+ pointer replaced). Tier 3 deferred to backlog (USER_GUIDE instructions journey,
79
+ ARCHITECTURE module inventory refresh, JSON `apply` example). Council reports at
80
+ `tmp/council/0{1,2,3}-*.md` (local-only). Process note: no release spec existed for this
81
+ cycle; the plan was consolidated and removed on ship.
82
+
83
+ ## Known follow-ups (not in this release)
84
+
85
+ - Movie brief-sync end-to-end with real clip generation (deferred, credits).
86
+ - Movie pipeline MCP tools; `gflow_list_characters` is still a stub (both are reasoned
87
+ exemptions in `tests/mcp/test_cli_parity.py`).
88
+ - `gflow_generate_video` deliberately has NO `instructions` param — the video pipeline has no
89
+ instructions support (documented in `docs/MCP.md`); adding it requires video-transport work.