gflow-cli 0.27.0__tar.gz → 0.28.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 (511) hide show
  1. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/CHANGELOG.md +42 -1
  2. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/PKG-INFO +1 -1
  3. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/INDEX.md +1 -1
  4. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.27.0.md +8 -1
  5. gflow_cli-0.28.0/docs/LIVE_VERIFICATION_v0.27.1.md +26 -0
  6. gflow_cli-0.28.0/docs/LIVE_VERIFICATION_v0.28.0.md +59 -0
  7. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/MOVIE.md +6 -2
  8. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/PROJECT_STATUS.md +7 -1
  9. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/USAGE.md +78 -0
  10. gflow_cli-0.28.0/docs/superpowers/plans/2026-07-08-agentic-instructions/PLAN.md +329 -0
  11. gflow_cli-0.28.0/docs/superpowers/plans/2026-07-08-agentic-instructions/spike-findings.md +210 -0
  12. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/pyproject.toml +1 -1
  13. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/ci/check_doc_links.py +2 -0
  14. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/__init__.py +1 -1
  15. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/client.py +48 -1
  16. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/image.py +73 -0
  17. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/drivers/agentic.py +114 -8
  18. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/ui_automation.py +15 -0
  19. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_image.py +39 -2
  20. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_movie.py +2 -2
  21. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/composition.py +3 -1
  22. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/mcp/resources.py +3 -0
  23. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/mcp/server.py +6 -1
  24. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/mcp/tools.py +5 -0
  25. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/worker/daemon.py +39 -2
  26. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client.py +54 -1
  27. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_image.py +53 -0
  28. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/drivers/test_agentic.py +166 -7
  29. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_ui_automation.py +71 -1
  30. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_image.py +88 -0
  31. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_movie.py +18 -0
  32. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/composition/test_handoff.py +3 -0
  33. gflow_cli-0.28.0/tests/e2e/test_live_agentic_instructions.py +132 -0
  34. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_video_agent_ui_steps.py +253 -3
  35. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/video_agent_ui.feature +24 -1
  36. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/mcp/test_server.py +1 -1
  37. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/worker/test_daemon.py +46 -0
  38. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/uv.lock +1 -1
  39. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/README.md +0 -0
  40. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/active.md +0 -0
  41. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/branch-review.md +0 -0
  42. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/changelog.md +0 -0
  43. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/check.md +0 -0
  44. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/doc-review.md +0 -0
  45. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/issue-assessment.md +0 -0
  46. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/issue-resolve.md +0 -0
  47. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/known-issues.md +0 -0
  48. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/next.md +0 -0
  49. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/plan.md +0 -0
  50. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/pr-council-review.md +0 -0
  51. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/predict.md +0 -0
  52. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/release.md +0 -0
  53. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/scenario.md +0 -0
  54. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/sonar.md +0 -0
  55. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.claude/commands/gflow/status.md +0 -0
  56. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.env.template +0 -0
  57. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.gitattributes +0 -0
  58. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/CODEOWNERS +0 -0
  59. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  60. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/copilot-instructions.md +0 -0
  61. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/dependabot.yml +0 -0
  62. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/workflows/ci.yml +0 -0
  63. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/workflows/external-pr-triage.yml +0 -0
  64. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/workflows/governance-advisory.yml +0 -0
  65. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/workflows/governance-benchmark.yml +0 -0
  66. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/workflows/main-base-guard.yml +0 -0
  67. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.github/workflows/release.yml +0 -0
  68. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.gitignore +0 -0
  69. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.gitleaks.toml +0 -0
  70. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.pre-commit-config.yaml +0 -0
  71. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/.secrets.baseline +0 -0
  72. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/AGENTS.md +0 -0
  73. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/CLAUDE.md +0 -0
  74. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/CONFIGURATION.md +0 -0
  75. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/CONTRIBUTING.md +0 -0
  76. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/DISCLAIMER.md +0 -0
  77. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/GEMINI.md +0 -0
  78. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/KNOWN_ISSUES.md +0 -0
  79. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/LICENSE +0 -0
  80. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/PLAN.md +0 -0
  81. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/README.md +0 -0
  82. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/RELEASE.md +0 -0
  83. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/ROADMAP.md +0 -0
  84. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/conftest.py +0 -0
  85. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docker-compose.yml +0 -0
  86. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/AGENT_GUIDE.md +0 -0
  87. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/AGENT_UI_E2E.md +0 -0
  88. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/AGENT_UI_RECON.md +0 -0
  89. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/ARCHITECTURE.md +0 -0
  90. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/AUTHENTICATION.md +0 -0
  91. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/CHARACTER.md +0 -0
  92. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/CHARACTER_RECON.md +0 -0
  93. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/CONFIGURATION.md +0 -0
  94. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/DATA_LAYER.md +0 -0
  95. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/DEBUGGING.md +0 -0
  96. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/DEMOS.md +0 -0
  97. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/DEVELOPMENT.md +0 -0
  98. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/E2E_TESTING.md +0 -0
  99. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/EXTERNAL_STORAGE.md +0 -0
  100. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/GITHUB.md +0 -0
  101. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
  102. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
  103. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
  104. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
  105. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
  106. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
  107. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
  108. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
  109. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
  110. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
  111. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
  112. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
  113. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
  114. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
  115. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
  116. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
  117. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
  118. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
  119. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
  120. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
  121. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
  122. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
  123. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
  124. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
  125. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
  126. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/MCP.md +0 -0
  127. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/PROMPT_EXPANSION.md +0 -0
  128. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/SECURITY.md +0 -0
  129. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/TOOLS.md +0 -0
  130. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/USER_GUIDE.md +0 -0
  131. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/assets/demo-split-pf.gif +0 -0
  132. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/assets/example-run.gif +0 -0
  133. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/assets/examples.webp +0 -0
  134. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/medium_tutorial.md +0 -0
  135. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/schemas/movie-handoff.schema.json +0 -0
  136. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/sonar-cleanup-tracker.md +0 -0
  137. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
  138. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
  139. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
  140. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
  141. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
  142. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
  143. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
  144. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
  145. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
  146. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
  147. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
  148. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
  149. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/README.md +0 -0
  150. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/batch_from_config.py +0 -0
  151. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/multi_prompt_t2i.py +0 -0
  152. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/sample_config.json +0 -0
  153. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/sample_prompts.txt +0 -0
  154. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/single_image_t2i.py +0 -0
  155. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/examples/workflow_chain.py +0 -0
  156. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/llms.txt +0 -0
  157. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/README.md +0 -0
  158. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/01_upload_image.json +0 -0
  159. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
  160. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
  161. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/04_archive_workflow.json +0 -0
  162. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/05_createProject.json +0 -0
  163. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/06_batchGenerateImages.json +0 -0
  164. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
  165. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
  166. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
  167. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
  168. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
  169. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/12_create_scene.json +0 -0
  170. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
  171. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/14_get_scene_workflows.json +0 -0
  172. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
  173. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/ci/check_materiality.py +0 -0
  174. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/ci/check_repo_hygiene.py +0 -0
  175. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/debug_editor.py +0 -0
  176. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/debug_gen_settings.py +0 -0
  177. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/debug_settings.py +0 -0
  178. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/_recording_client.py +0 -0
  179. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/_spike_common.py +0 -0
  180. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/active_plan.py +0 -0
  181. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
  182. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
  183. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
  184. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
  185. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
  186. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
  187. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/capture_locale_invariants.py +0 -0
  188. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
  189. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/character_create_spike.py +0 -0
  190. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/character_create_spike_v2.py +0 -0
  191. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/dump_character_selectors.js +0 -0
  192. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/make_project.py +0 -0
  193. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/materiality_backtest.py +0 -0
  194. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/monitor_pr_38.py +0 -0
  195. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/patch_character.py +0 -0
  196. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/skillopt/README.md +0 -0
  197. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/skillopt/harness.py +0 -0
  198. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/skillopt/tasks.json +0 -0
  199. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_char_editor_dom.py +0 -0
  200. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_char_gen_capture.py +0 -0
  201. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
  202. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
  203. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
  204. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
  205. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
  206. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
  207. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
  208. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
  209. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
  210. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_movie_picker_select.py +0 -0
  211. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_movie_voice_list.py +0 -0
  212. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_patch_entity.py +0 -0
  213. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/dev/spike_patchright.py +0 -0
  214. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/diag/README.md +0 -0
  215. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/diag/capture_flow_traffic.py +0 -0
  216. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/diag/memory_profile.py +0 -0
  217. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/diag/recaptcha_mint.py +0 -0
  218. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
  219. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/e2e/capture_agent_toggle.py +0 -0
  220. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/record_demo.ps1 +0 -0
  221. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/smoke_image.py +0 -0
  222. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/smoke_real_chrome_image.py +0 -0
  223. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/smoke_video_editor.py +0 -0
  224. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/smoke_worker_style.py +0 -0
  225. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/scripts/verify_chrome_auth_viability.py +0 -0
  226. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/README.md +0 -0
  227. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/gflow-cli/SKILL.md +0 -0
  228. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/issue-assessment/SKILL.md +0 -0
  229. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/issue-resolve/SKILL.md +0 -0
  230. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/plan/SKILL.md +0 -0
  231. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/pr-council-review/SKILL.md +0 -0
  232. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/predict/SKILL.md +0 -0
  233. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/scenario/SKILL.md +0 -0
  234. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/skills/status/SKILL.md +0 -0
  235. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/sonar-project.properties +0 -0
  236. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/__main__.py +0 -0
  237. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/_cli_helpers.py +0 -0
  238. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/__init__.py +0 -0
  239. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/_engine.py +0 -0
  240. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/_retry.py +0 -0
  241. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
  242. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/character.py +0 -0
  243. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/dto.py +0 -0
  244. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/image_upscale.py +0 -0
  245. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/recaptcha.py +0 -0
  246. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/routes.py +0 -0
  247. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/scene.py +0 -0
  248. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/__init__.py +0 -0
  249. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/_common.py +0 -0
  250. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
  251. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/base.py +0 -0
  252. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
  253. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
  254. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
  255. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
  256. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
  257. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
  258. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
  259. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
  260. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
  261. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/api/video.py +0 -0
  262. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/__init__.py +0 -0
  263. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/base.py +0 -0
  264. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/cookies.py +0 -0
  265. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/factory.py +0 -0
  266. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
  267. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/real_chrome.py +0 -0
  268. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/strategies.py +0 -0
  269. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/auth/verification.py +0 -0
  270. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/browser_manager.py +0 -0
  271. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/chain.py +0 -0
  272. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/chain_manifest.py +0 -0
  273. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli.py +0 -0
  274. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_character.py +0 -0
  275. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_data.py +0 -0
  276. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_models.py +0 -0
  277. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_run.py +0 -0
  278. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_scene.py +0 -0
  279. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_tools.py +0 -0
  280. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/cli_video.py +0 -0
  281. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/config.py +0 -0
  282. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/__init__.py +0 -0
  283. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/chain_repo.py +0 -0
  284. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
  285. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
  286. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
  287. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
  288. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
  289. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
  290. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
  291. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
  292. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
  293. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/models.py +0 -0
  294. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/queries.py +0 -0
  295. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/recorder.py +0 -0
  296. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/redaction.py +0 -0
  297. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/repository.py +0 -0
  298. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/data/store.py +0 -0
  299. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/errors.py +0 -0
  300. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/exceptions.py +0 -0
  301. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/image_batch.py +0 -0
  302. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/json_output.py +0 -0
  303. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/manifest.py +0 -0
  304. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/mcp/__init__.py +0 -0
  305. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/mcp/prompts.py +0 -0
  306. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/media.py +0 -0
  307. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/movie_manifest.py +0 -0
  308. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/observability.py +0 -0
  309. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/paths.py +0 -0
  310. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/profile_store.py +0 -0
  311. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/services/__init__.py +0 -0
  312. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/services/character_create.py +0 -0
  313. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/storage.py +0 -0
  314. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/__init__.py +0 -0
  315. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/banned.py +0 -0
  316. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
  317. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
  318. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/expander.py +0 -0
  319. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/invocation.py +0 -0
  320. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/loader.py +0 -0
  321. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/registry.py +0 -0
  322. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/runtime.py +0 -0
  323. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/tools/spec.py +0 -0
  324. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/ui/app.py +0 -0
  325. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/ui/server.py +0 -0
  326. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/src/gflow_cli/worker/queue.py +0 -0
  327. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tasks/lessons.md +0 -0
  328. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/test_assets/sample_batch.json +0 -0
  329. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/test_assets/sample_batch.tsv +0 -0
  330. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/test_assets/sample_batch_invalid.tsv +0 -0
  331. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/__init__.py +0 -0
  332. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/__init__.py +0 -0
  333. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/fixtures/character_gen_response.json +0 -0
  334. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/fixtures/patch_entity_response.json +0 -0
  335. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_aisandbox_auth_error.py +0 -0
  336. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
  337. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_bearer_redaction.py +0 -0
  338. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_character.py +0 -0
  339. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_character.py +0 -0
  340. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_delete_characters.py +0 -0
  341. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_generate_character.py +0 -0
  342. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_image.py +0 -0
  343. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_launch_kwargs.py +0 -0
  344. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_patch_entity.py +0 -0
  345. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_scene.py +0 -0
  346. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_client_upscale.py +0 -0
  347. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_concurrency.py +0 -0
  348. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_dto.py +0 -0
  349. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_engine.py +0 -0
  350. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_image_dto.py +0 -0
  351. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_image_upscale.py +0 -0
  352. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
  353. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_recaptcha.py +0 -0
  354. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_retry.py +0 -0
  355. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_routes.py +0 -0
  356. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_routes_character.py +0 -0
  357. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_routes_scene.py +0 -0
  358. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_sapisidhash_helper.py +0 -0
  359. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_scene_models.py +0 -0
  360. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_video.py +0 -0
  361. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/test_video_request.py +0 -0
  362. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/__init__.py +0 -0
  363. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/conftest.py +0 -0
  364. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/drivers/__init__.py +0 -0
  365. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/drivers/test_factory.py +0 -0
  366. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_base.py +0 -0
  367. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_bearer.py +0 -0
  368. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_common.py +0 -0
  369. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
  370. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_factory.py +0 -0
  371. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_fingerprint.py +0 -0
  372. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_sapisidhash.py +0 -0
  373. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_transport_timeout.py +0 -0
  374. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
  375. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
  376. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_ui_automation_video.py +0 -0
  377. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/api/transports/test_ui_character_editor.py +0 -0
  378. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/auth/strategies/test_factory.py +0 -0
  379. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/auth/strategies/test_strategies.py +0 -0
  380. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/auth/test_cookies.py +0 -0
  381. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/auth/test_verification.py +0 -0
  382. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/__init__.py +0 -0
  383. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_auth_list.py +0 -0
  384. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_character.py +0 -0
  385. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_character_create.py +0 -0
  386. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_data.py +0 -0
  387. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
  388. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
  389. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_image_upscale.py +0 -0
  390. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_models.py +0 -0
  391. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_run.py +0 -0
  392. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_scene.py +0 -0
  393. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_tools.py +0 -0
  394. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_video.py +0 -0
  395. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_cli_video_chain.py +0 -0
  396. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_error_handling.py +0 -0
  397. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_helpers.py +0 -0
  398. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_movie_manifest.py +0 -0
  399. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
  400. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_settings_validation.py +0 -0
  401. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
  402. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/composition/test_character.py +0 -0
  403. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/composition/test_compose_prompt.py +0 -0
  404. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/composition/test_style_variants.py +0 -0
  405. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/composition/test_style_variants_e2e.py +0 -0
  406. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/conftest.py +0 -0
  407. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/__init__.py +0 -0
  408. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_chain_repo.py +0 -0
  409. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_find_incomplete_character.py +0 -0
  410. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_models.py +0 -0
  411. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_packaging.py +0 -0
  412. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_recorder.py +0 -0
  413. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_recorder_character.py +0 -0
  414. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_redaction.py +0 -0
  415. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_repository.py +0 -0
  416. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_scene_persistence.py +0 -0
  417. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_settings_and_errors.py +0 -0
  418. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/data/test_store_migrations.py +0 -0
  419. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/dev/test_recording_client.py +0 -0
  420. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/__init__.py +0 -0
  421. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/conftest.py +0 -0
  422. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
  423. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
  424. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_chain_e2e.py +0 -0
  425. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_character_create_e2e.py +0 -0
  426. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_daemon_e2e.py +0 -0
  427. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_data_layer_e2e.py +0 -0
  428. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
  429. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_image_batch_e2e.py +0 -0
  430. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
  431. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_json_output_e2e.py +0 -0
  432. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
  433. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_scene_compose_live.py +0 -0
  434. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_tools_e2e.py +0 -0
  435. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_transports_e2e.py +0 -0
  436. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
  437. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
  438. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/__init__.py +0 -0
  439. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/auth.feature +0 -0
  440. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/auth_login.feature +0 -0
  441. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/character_create.feature +0 -0
  442. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/character_read.feature +0 -0
  443. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/conftest.py +0 -0
  444. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/image.feature +0 -0
  445. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/image_upscale.feature +0 -0
  446. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/locale_picker_include.feature +0 -0
  447. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_auth_login_steps.py +0 -0
  448. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_auth_steps.py +0 -0
  449. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_character_create_steps.py +0 -0
  450. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_character_read_steps.py +0 -0
  451. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_image_steps.py +0 -0
  452. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_image_upscale_steps.py +0 -0
  453. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_locale_picker_include_steps.py +0 -0
  454. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_step_collision_guard.py +0 -0
  455. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/test_video_chain_steps.py +0 -0
  456. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/features/video_chain.feature +0 -0
  457. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/fixtures/__init__.py +0 -0
  458. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/fixtures/seeded_catalog.py +0 -0
  459. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/image_batch/__init__.py +0 -0
  460. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/image_batch/test_image_manifest.py +0 -0
  461. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/image_batch/test_observability_events.py +0 -0
  462. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/integration/__init__.py +0 -0
  463. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/integration/conftest.py +0 -0
  464. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/integration/constants.py +0 -0
  465. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/integration/test_storage_gcs.py +0 -0
  466. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/integration/test_storage_s3.py +0 -0
  467. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/mcp/__init__.py +0 -0
  468. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/mcp/conftest.py +0 -0
  469. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/mcp/test_stdio_transport.py +0 -0
  470. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/mcp/test_tools_helpers.py +0 -0
  471. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/mcp/test_tools_wired.py +0 -0
  472. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
  473. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
  474. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/scripts/test_check_materiality.py +0 -0
  475. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
  476. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/scripts/test_materiality_backtest.py +0 -0
  477. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/services/__init__.py +0 -0
  478. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/services/test_character_create_redaction.py +0 -0
  479. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/services/test_character_create_saga.py +0 -0
  480. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
  481. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/smoke/__init__.py +0 -0
  482. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/smoke/test_profile_account_smoke.py +0 -0
  483. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/smoke/test_real_flow.py +0 -0
  484. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_auth.py +0 -0
  485. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_browser_manager.py +0 -0
  486. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_chain.py +0 -0
  487. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_chain_manifest.py +0 -0
  488. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_cli_data.py +0 -0
  489. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_config.py +0 -0
  490. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_conftest_isolation.py +0 -0
  491. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_data_queries.py +0 -0
  492. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_documentation_gate.py +0 -0
  493. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_errors.py +0 -0
  494. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_errors_403.py +0 -0
  495. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_json_output.py +0 -0
  496. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_manifest.py +0 -0
  497. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_marker_registry.py +0 -0
  498. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_media.py +0 -0
  499. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_observability.py +0 -0
  500. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_paths.py +0 -0
  501. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_profile_store.py +0 -0
  502. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/test_smoke.py +0 -0
  503. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/__init__.py +0 -0
  504. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_banned.py +0 -0
  505. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_expander.py +0 -0
  506. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_invocation.py +0 -0
  507. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_loader.py +0 -0
  508. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_registry.py +0 -0
  509. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_runtime.py +0 -0
  510. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/tools/test_spec.py +0 -0
  511. {gflow_cli-0.27.0 → gflow_cli-0.28.0}/tests/ui/test_app.py +0 -0
@@ -7,6 +7,45 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.28.0] — 2026-07-08
11
+
12
+ ### Added
13
+
14
+ - **Agent instructions (`-i` / `--instruction`) now actually steer generation.** On an
15
+ agentic-cohort Flow session, `gflow image t2i "…" -i "Every image is a flat 2D crayon
16
+ drawing"` makes the agent adopt that style (live-verified end-to-end). Instruction cards are
17
+ synced to the project's Agent brief via `PATCH /v1/projects/{id}/agentInfo`, and the agent
18
+ folds every **enabled** card into the generation. Cards carry distinct titles and may
19
+ reference image assets. Persistent CRUD (`gflow instructions`) and movie-manifest wiring are
20
+ planned follow-ups.
21
+
22
+ ### Fixed
23
+
24
+ - **Instructions were silently inert (agentic transport).** Two root causes, both found via a
25
+ live spike: (1) the composer used an imperative `"Generate N images: …"` directive that the
26
+ agent passes to the image tool verbatim, bypassing the brief — now phrased conversationally
27
+ so the agent's reasoning step applies the cards; (2) the brief-level master switch
28
+ `project_brief.enabled` was never set (defaults off on a fresh project → all cards ignored) —
29
+ now enabled whenever cards are synced. Also fixes a wrong PATCH content-type
30
+ (`application/json+protobuf` → HTTP 400, silently) and a hardcoded per-card title that
31
+ collapsed every card to one name.
32
+ - **`-i` no longer no-ops without warning on a classic-cohort session:** a clear warning is now
33
+ emitted (instructions only apply on agentic sessions).
34
+
35
+ ## [0.27.1] — 2026-07-07
36
+
37
+ ### Fixed
38
+
39
+ - **Version Wiring in Movie Handoff:** Properly imported and passed `__version__` to `build_handoff()` generator version instead of using a hardcoded stale default (`0.14.0`).
40
+ - **Rich Markup Escaping in CLI Output:** Escaped brackets in `_format_scene_line` plan output (`[t2v]`, `[r2v]`, and `refs=[...]`) so they are not swallowed by Rich console formatting.
41
+ - **MCP Server Stale Version:** Wired FastMCP version to `__version__` dynamically on startup, fixing the stale `0.21.0` version trap.
42
+ - **MCP Agent Guide:** Added `gflow_list_tools` to the list of available tools in the static MCP agent guide resource.
43
+
44
+ ### Added
45
+
46
+ - **Document Anchors:** Added HTML anchor (`style-configuration-errors`) to `docs/MOVIE.md` for reserved name `"none"` and unknown style variant `ConfigurationError` paths.
47
+ - **Movie Usages Documentation:** Added complete documentation for `gflow movie run` and `gflow movie template` commands to `docs/USAGE.md`.
48
+
10
49
  ## [0.27.0] — 2026-07-07
11
50
 
12
51
  ### Added
@@ -1830,7 +1869,9 @@ shell-script template that branches on these codes.
1830
1869
 
1831
1870
  First skeleton. Not functional end-to-end yet.
1832
1871
 
1833
- [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.27.0...HEAD
1872
+ [Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.28.0...HEAD
1873
+ [0.28.0]: https://github.com/ffroliva/gflow-cli/compare/v0.27.1...v0.28.0
1874
+ [0.27.1]: https://github.com/ffroliva/gflow-cli/compare/v0.27.0...v0.27.1
1834
1875
  [0.27.0]: https://github.com/ffroliva/gflow-cli/compare/v0.26.0...v0.27.0
1835
1876
  [0.26.0]: https://github.com/ffroliva/gflow-cli/compare/v0.25.0...v0.26.0
1836
1877
  [0.25.0]: https://github.com/ffroliva/gflow-cli/compare/v0.24.0...v0.25.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gflow-cli
3
- Version: 0.27.0
3
+ Version: 0.28.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
@@ -120,7 +120,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
120
120
  **"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
121
121
  **"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
122
122
  **"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.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)
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)
124
124
  **"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
125
  **"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
126
  **"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
@@ -87,7 +87,14 @@ before PR #259; cosmetic; tracked as a follow-up.
87
87
 
88
88
  ## Post-tag evidence
89
89
 
90
- *(filled after the v0.27.0 tag push / publish)*
90
+ - Signed tag `v0.27.0` pushed 2026-07-07; `Release` workflow green
91
+ (build-and-publish 37s, digital attestations generated).
92
+ - GitHub Release **v0.27.0** published 2026-07-07T21:16:40Z (not draft).
93
+ - PyPI: `gflow-cli 0.27.0` live — `gflow_cli-0.27.0-py3-none-any.whl` +
94
+ `gflow_cli-0.27.0.tar.gz` (verified via the PyPI JSON API).
95
+ - Release PR #260 (`chore/release-v0.27.0 → main`) merged with a merge commit
96
+ after a fully green matrix + SonarCloud gate; branch deleted.
97
+ - `main` back-merged into `develop` (`2909cb6`) — branches aligned.
91
98
 
92
99
  ## Automated coverage
93
100
 
@@ -0,0 +1,26 @@
1
+ # Live Verification — v0.27.1
2
+
3
+ Release date: 2026-07-07. Headline: **v0.27.0 release follow-up fixes and documentation sync** (Issue #239, PR #261).
4
+
5
+ Verification run: 2026-07-07, local validation gates, Windows, `.venv` build of the release tree. **Deliberately credit-free**: this patch release contains only default parameter wiring, Rich console escaping, MCP guide documentation synchronization, and user documentation. No live Flow REST api/browser automation code paths were changed, so no live generation credits were spent.
6
+
7
+ ## Scope
8
+
9
+ | Change | Surface | Verdict |
10
+ |---|---|---|
11
+ | Wire package version `__version__` as default `version` in `build_handoff()` | `composition.py` | ✅ Unit tests pass (`test_build_handoff_shape_and_schema`) |
12
+ | Escape brackets `\[` in plan output mode and refs | `cli_movie.py` | ✅ Unit tests pass (`test_format_scene_line_escapes_brackets_for_rich`) |
13
+ | Add `gflow_list_tools` to MCP agent guide | `mcp/resources.py` | ✅ MCP guide resource updated |
14
+ | Set `__version__` on FastMCP server on startup | `mcp/server.py` | ✅ MCP tests pass |
15
+ | Add HTML anchors for style configuration errors | `docs/MOVIE.md` | ✅ Document checked via `check_doc_links.py` |
16
+ | Add `gflow movie` subcommands documentation | `docs/USAGE.md` | ✅ USAGE.md updated and link-checked |
17
+
18
+ ## Evidence ledger (Verification Gates)
19
+
20
+ All local quality gates executed in order as a merge-readiness baseline:
21
+ 1. **Hygiene check:** `check_repo_hygiene.py` ran with 0 violations across 505 tracked files.
22
+ 2. **Internal links check:** `check_doc_links.py` successfully resolved all internal markdown links across 24 files (including `docs/MOVIE.md` and `docs/USAGE.md`).
23
+ 3. **Lint check:** `ruff check src tests` passed with 0 errors.
24
+ 4. **Formatting check:** `ruff format --check src tests` verified all files are formatted.
25
+ 5. **Type check:** `pyright src` completed with 0 errors and 0 warnings.
26
+ 6. **Tests run:** 2056 tests passed, 16 skipped, 55 deselected.
@@ -0,0 +1,59 @@
1
+ # Live Verification — v0.28.0
2
+
3
+ Release date: 2026-07-08. Headline: **Agent instructions (`-i` / `--instruction`) now actually steer agentic image generation** (PR #263).
4
+
5
+ Verification run: 2026-07-08, live Flow against profile `ffroliva` (agentic cohort), Windows, `.venv` build of the release tree. **Credit-spending:** this release changes the live agentic generation path, so it was exercised end-to-end against real Flow (image generation).
6
+
7
+ ## Scope
8
+
9
+ | Change | Surface | Verdict |
10
+ |---|---|---|
11
+ | Conversational `_compose_directive` (engages the agent's reasoning path) | `api/transports/drivers/agentic.py` | ✅ Live: enabled card applied |
12
+ | Reconcile sets brief master switch `project_brief.enabled=true` + `text/plain` content-type + status-checked | `api/transports/drivers/agentic.py` | ✅ Live: 200, no `patch_failed` |
13
+ | `AgentInstruction.title` / `resolved_title()` + shared `build_agent_brief_cards()` | `api/image.py` | ✅ Unit tests |
14
+ | `patch_agent_info` returns echoed `projectBrief` | `api/client.py` | ✅ Unit tests |
15
+ | Warn when `-i` used on a classic-cohort session | `api/transports/ui_automation.py` | ✅ Unit tests (both cohorts) |
16
+
17
+ ## Live scenario
18
+
19
+ `tests/e2e/test_live_agentic_instructions.py` (`-m e2e_image`, `GFLOW_CLI_FORCE_AGENT_UI=1`)
20
+ drove the REAL transport: create project → force agent → reconcile PATCH → conversational
21
+ submit → DOM scrape. Prompt was **style-neutral** ("a cat sitting on a wooden chair next to
22
+ a window") with a single **enabled** instruction card: "Every image MUST be rendered as a
23
+ flat 2D children's crayon drawing on textured paper…". Any crayon styling can therefore only
24
+ have come from the card.
25
+
26
+ ## Evidence ledger (5-layer)
27
+
28
+ 1. **File count:** exactly one image file written per generation (`<media_id>.jpg`).
29
+ 2. **Magic bytes:** the downloaded file passed the container sniff (`_image_kind` → `jpeg`).
30
+ 3. **Shape:** a valid landscape (16:9) render; agentic DOM scrape reports `(0,0)` sentinel
31
+ dimensions by design (wire dims are Web-Worker-delegated), so shape is confirmed visually.
32
+ 4. **Structlog invariants:** `ui_driver.bound mode=agentic` fired (not classic);
33
+ `agentic_driver.reconcile_instructions.patch` fired; **no**
34
+ `agentic_driver.reconcile_instructions.patch_failed` (content-type/auth regression guard).
35
+ 5. **User-confirmable artifact:** the generated image is an **unmistakable children's crayon
36
+ drawing** (waxy strokes, textured paper, primary palette) — visually confirmed to match the
37
+ enabled card, from a prompt containing zero style words. A control generation with the crayon
38
+ instruction in the *prompt* (not the card) confirmed the model can render crayon, isolating
39
+ the card (not a model limitation) as the applied factor.
40
+
41
+ ### Negative control (mechanism proof)
42
+
43
+ - Imperative `"Generate one image: …"` directive + same enabled card → **photorealistic**
44
+ (brief bypassed). Conversational phrasing → **crayon** (brief applied). This isolated the
45
+ phrasing fix. A follow-up run isolated the second fix: with cards synced but
46
+ `project_brief.enabled` unset → photorealistic; with the master switch on → crayon.
47
+
48
+ ## Gates
49
+
50
+ Local: `ruff check` 0 errors · `ruff format` clean · `pyright src` 0 errors · unit + BDD suites
51
+ green. CI on PR #263: tests (3.11/3.12/3.13) + **SonarCloud quality gate** all green
52
+ (new-code coverage ≥ 80%).
53
+
54
+ ## Known follow-ups (not in this release)
55
+
56
+ - `gflow instructions` persistent CRUD subcommand.
57
+ - `movie.toml` per-scene instruction wiring.
58
+ - `GFLOW_CLI_FORCE_AGENT_UI` binding is ~50/50 flaky on fresh projects (may bind classic).
59
+ - H4: reference images (`imageReferenceMediaIds`) on cards — untested.
@@ -101,8 +101,12 @@ Per-scene selection:
101
101
  | *(omitted)* | Uses the base `[style]` suffix. |
102
102
  | `style_suffix = "sunset light"` | Scene-specific text appended **after** the variant/base suffix. |
103
103
 
104
- `none` is a **reserved name**: defining `[style.variants.none]` is a
105
- configuration error, so the opt-out keyword can never shadow a real variant.
104
+ <a name="style-configuration-errors"></a>
105
+ ### Style Configuration Errors
106
+
107
+ There are two style configuration errors that will raise a `ConfigurationError`:
108
+ * **Reserved `none` name:** Defining `[style.variants.none]` is a configuration error, so the opt-out keyword can never shadow a real variant.
109
+ * **Unknown variant name:** Specifying a `style_variant` in a scene that does not exist in `[style.variants]` (and is not `"none"`) is a configuration error.
106
110
 
107
111
  **Composition rule** (deterministic, no LLM):
108
112
 
@@ -4,6 +4,12 @@
4
4
 
5
5
  ## Current release
6
6
 
7
+ **v0.27.1 — alpha.** **v0.27.0 release follow-up fixes and documentation sync (#239).** Patch release wiring package version dynamically to `build_handoff()` and `FastMCP` server, escaping brackets in Rich console planning output, updating MCP agent guide, and adding `gflow movie` usage documentation. Verification: [LIVE_VERIFICATION_v0.27.1](LIVE_VERIFICATION_v0.27.1.md) (credit-free baseline verification).
8
+
9
+ **Develop (unreleased, post-v0.27.1):** *(empty — develop is the staging branch for the next release).*
10
+
11
+ <details><summary>v0.27.0 — Global [style] block with named variants + prompt-aware resume for gflow movie</summary>
12
+
7
13
  **v0.27.0 — alpha.** **Global `[style]` block with named variants + prompt-aware resume
8
14
  for `gflow movie` (#239).** A `movie.toml` can now express a visual style system once —
9
15
  `prefix`/`suffix` on `[style]` plus `[style.variants.*]` sub-tables — and select it
@@ -15,7 +21,7 @@ instead of silently skipped, and dry-run marks it `re-run (style changed)`. Carr
15
21
  forward v0.26.0 (i2i select-in-place by UUID). Verification:
16
22
  [LIVE_VERIFICATION_v0.27.0](LIVE_VERIFICATION_v0.27.0.md) (credit-free CLI ledger).
17
23
 
18
- **Develop (unreleased, post-v0.27.0):** *(empty — develop is the staging branch for the next release).*
24
+ </details>
19
25
 
20
26
  <details><summary>v0.26.0 — image i2i references a generated image by UUID (select in place)</summary>
21
27
 
@@ -1044,6 +1044,84 @@ GFLOW_EXAMPLE_PROFILE=<your-profile> python examples/batch_from_config.py
1044
1044
 
1045
1045
  The bundled `examples/sample_config.json` produces three images at three aspect ratios in `gflow-output/example-batch/`. Copy and edit for your own scenes.
1046
1046
 
1047
+ ## `gflow movie`
1048
+
1049
+ Sequential TOML-described multi-scene AI movie generation. New in v0.14.0.
1050
+
1051
+ ### `gflow movie template`
1052
+
1053
+ Writes a starter `movie.toml` template.
1054
+
1055
+ ```text
1056
+ gflow movie template [OUTPUT] [--force]
1057
+ ```
1058
+
1059
+ * `OUTPUT`: The destination path for the template file (defaults to `./movie.toml`).
1060
+ * `--force`: Overwrite the destination file if it already exists.
1061
+
1062
+ ### `gflow movie run`
1063
+
1064
+ Generates individual video clips sequentially from a single TOML manifest file, maintaining crash-recoverable state in a local state JSON file.
1065
+
1066
+ ```text
1067
+ gflow movie run MANIFEST [--out-dir DIR] [--profile NAME] [--continue-on-error|--fail-fast] [--dry-run] [--stitch]
1068
+ ```
1069
+
1070
+ Refer to the complete [Movie Manifests Guide](MOVIE.md) for detailed syntax, character entity creation, and style consistency features.
1071
+
1072
+ ### Parameters
1073
+
1074
+ * `MANIFEST`: Path to your `movie.toml` manifest file (required positional argument).
1075
+ * `--out-dir DIR`: Output directory for generated video clips and the handoff file. Defaults to `out/` or `GFLOW_CLI_OUTPUT_DIR`.
1076
+ * `--profile NAME`: Specify Google Flow profile to use.
1077
+ * `--continue-on-error`: Skip failed scenes and continue generating subsequent scenes (default).
1078
+ * `--fail-fast`: Terminate immediately on the first failed scene generation.
1079
+ * `--dry-run`: Parse the manifest, estimate credits, and print the generation plan without calling Google Flow.
1080
+ * `--stitch`: Run a post-generation preview stitch using ffmpeg to concatenate clips into a single video file.
1081
+
1082
+ ### Manifest structure (movie.toml)
1083
+
1084
+ ```toml
1085
+ title = "My Cinematic Film"
1086
+ project = "Cinematics"
1087
+
1088
+ [style]
1089
+ look = "3d animation"
1090
+ mood = "mysterious"
1091
+ negative = "text, watermark"
1092
+ prefix = "Cinematic film still, high detail."
1093
+ suffix = "Shot on IMAX 70mm, unreal engine 5 render."
1094
+
1095
+ [style.variants.warm]
1096
+ suffix = "Golden hour light, warm color grading."
1097
+
1098
+ [[characters]]
1099
+ name = "Stickman"
1100
+ identity = "text"
1101
+ voice = "alnilam"
1102
+
1103
+ [[scenes]]
1104
+ id = "scene_01"
1105
+ action = "A mysterious stickman walks slowly through a dark forest."
1106
+ framing = "wide"
1107
+ duration = 5
1108
+ characters = ["Stickman"]
1109
+
1110
+ [[scenes]]
1111
+ id = "scene_02"
1112
+ action = "Close up of the stickman looking back in shock."
1113
+ framing = "close-up"
1114
+ duration = 5
1115
+ characters = ["Stickman"]
1116
+ style_variant = "warm"
1117
+ ```
1118
+
1119
+ ### Outputs
1120
+
1121
+ 1. **Clip Files:** Individual video files saved under `<out_dir>/scene_<id>.mp4` (or other formats).
1122
+ 2. **State File:** A `<stem>-state.json` file recording completed operations, seeds, and metadata, allowing a run to resume without wasting credits.
1123
+ 3. **Handoff Manifest:** A `<stem>-handoff.json` file that projects the run's metadata and clip paths, designed for downstream assemblers.
1124
+
1047
1125
  ## Recipes
1048
1126
 
1049
1127
  ### Burn through a directory of inputs
@@ -0,0 +1,329 @@
1
+ # API-Driven & Relational Agentic Instructions Implementation Plan
2
+
3
+ > **For agentic workers:** Run `/gflow:status --feature agentic-instructions` to find the next
4
+ > unchecked task. Implement one task at a time. Run `/gflow:check` before every commit.
5
+
6
+ **Goal:** Implement a programmatic, API-driven, and relational instructions management system in the Google Flow Agentic transport, coordinating reference assets across individual generations and multi-scene movies.
7
+
8
+ **Architecture:**
9
+ We will shift from DOM-based automation inside Playwright to direct REST API calls using `PATCH /v1/projects/{projectId}/agentInfo`, which is project-scoped and supports relational asset attachments (`imageReferenceMediaIds`). We will expose this relational schema on the image/video DTOs, integrate it with the background worker, add `movie.toml` scene-level mapping, and conclude with a systematic developer skills audit.
10
+
11
+ **Predict verdict:** GO — confidence 9/10
12
+
13
+ **Risk register:**
14
+ | Severity | Risk | Mitigation |
15
+ |---|---|---|
16
+ | Medium | API signature drift on Google Flow backend | Scope tests to verify response status and keep Playwright DOM fallback logic in place |
17
+ | Low | Invalid media ID attachments | Pre-flight check verifies that any attached `imageReferenceMediaIds` are active in the project's media catalog |
18
+
19
+ ---
20
+
21
+ ## File structure
22
+
23
+ ### New files
24
+ ```
25
+ tests/e2e/test_live_agentic_instructions.py
26
+ Live verification tests for the instructions lifecycle and image generation.
27
+ ```
28
+
29
+ ### Modified files
30
+ ```
31
+ src/gflow_cli/api/client.py
32
+ Add patch_agent_info endpoint method.
33
+ src/gflow_cli/api/image.py
34
+ Extend AgentInstruction and GenerateImageRequest DTOs.
35
+ src/gflow_cli/api/transports/drivers/agentic.py
36
+ Update configure_image_settings to call patch_agent_info instead of driving DOM.
37
+ src/gflow_cli/movie_manifest.py
38
+ Integrate scene-specific instructions sync before generating each scene's clips.
39
+ skills/*
40
+ Audit and synchronize all agent skills with the latest codebase architecture.
41
+ ```
42
+
43
+ ---
44
+
45
+ ## Task 1 — Unit Test & Mock Scaffold (test scaffold)
46
+
47
+ **What:** Create unit test mocks verifying relational instructions serialization and the `patch_agent_info` method wrapper.
48
+
49
+ **Files:**
50
+ - `tests/api/transports/drivers/test_agentic.py` — Mock testing for driver-API integration.
51
+ - `tests/worker/test_daemon.py` — Verify relational instructions extraction from background queue payload.
52
+
53
+ **Steps:**
54
+ - [x] Write mock DTO serialization tests for `AgentInstruction` containing `image_media_ids`.
55
+ - [x] Add assertions ensuring the driver correctly calls the `patch_agent_info` client method with structured payloads.
56
+
57
+ **Tests created (red):**
58
+ - [x] `test_agent_instruction_serialization_with_references`
59
+ - [x] `test_driver_reconcile_dispatches_patch_payload`
60
+
61
+ ---
62
+
63
+ ## Task 2 — BDD Feature & Step Scaffold (test scaffold)
64
+
65
+ **What:** Write BDD scenarios to verify relational instructions coordination in Cucumber features.
66
+
67
+ **Files:**
68
+ - `tests/features/video_agent_ui.feature` — Append scenarios for multi-instruction asset mapping.
69
+ - `tests/features/test_video_agent_ui_steps.py` — Implement step definitions simulating the mock server responses.
70
+
71
+ **Steps:**
72
+ - [x] Write Cucumber scenario for syncing relational instructions.
73
+ - [x] Mock the tRPC and REST responses for project brief updates.
74
+
75
+ **Tests created (red):**
76
+ - [x] Scenario: "Syncing instructions containing reference image IDs"
77
+ - [x] Scenario: "Toggling active/inactive states of relational cards"
78
+
79
+ ---
80
+
81
+ ## Task 3 — Relational Instructions API Client Implementation (implementation)
82
+
83
+ **What:** Implement direct `FlowApiClient` methods for patching agent settings.
84
+
85
+ **Files:**
86
+ - `src/gflow_cli/api/client.py` — Implement `patch_agent_info(project_id, enabled, cards)`.
87
+ - `src/gflow_cli/api/image.py` — Update `AgentInstruction` class attributes.
88
+
89
+ **Steps:**
90
+ - [x] Add `image_media_ids` and `character_ids` fields to `AgentInstruction`.
91
+ - [x] Implement `patch_agent_info` using the REST route `PATCH /v1/projects/{projectId}/agentInfo`.
92
+ - [x] Support `updateMask` parameters to selectively update `project_brief.enabled` and `project_brief.cards`.
93
+
94
+ ---
95
+
96
+ ## Task 4 — Driver and Worker Integration (integration)
97
+
98
+ **What:** Update `AgenticFlowUiDriver` and the daemon worker to use the new API client method.
99
+
100
+ **Files:**
101
+ - `src/gflow_cli/api/transports/drivers/agentic.py` — Call `patch_agent_info` inside `configure_image_settings`.
102
+ - `src/gflow_cli/worker/daemon.py` — Parse relational assets from task queue and forward them.
103
+
104
+ **Steps:**
105
+ - [x] Modify `configure_image_settings` to bypass DOM loop reconciliation and call the client REST endpoint directly.
106
+ - [x] Refactor background daemon payload builder to support `image_media_ids` mapping.
107
+
108
+ ---
109
+
110
+ ## Task 5 — Live Agentic Image Generation Spike (spike)
111
+
112
+ **What:** Validate empirically that the REST PATCH → generate round-trip works as expected
113
+ before writing any more production code. Run a real T2I generation on an agentic profile
114
+ with instructions ON vs OFF. Confirm cards influence output and that the `enabled: false`
115
+ soft-disable is respected by the model.
116
+
117
+ **Files:**
118
+ - `C:\development\github\gflow-agent-browser-spike\instructions_spike.py` — standalone spike script.
119
+
120
+ **Steps:**
121
+ - [x] Run `scripts/probe-agent-mode.ps1` on an active Flow browser session to inspect and verify all Agent Mode and sidebar DOM selectors, attributes, and roles.
122
+ - [x] Write spike: create project, PATCH two cards (one enabled, one disabled), generate one image, inspect output. (`scratch/spike_instructions_phase_a.py` + live Chrome; project `6b714c4e…`.)
123
+ - [x] Confirm `enabled: false` card does NOT appear to influence generation. (Confirmed — disabled noir card never injected.)
124
+ - [ ] ~~Confirm `imageReferenceMediaIds` on a card actually anchors the model's visual style.~~ Deferred — not tested; plausible via the reasoning path. Probe later with an uploaded asset.
125
+ - [x] Document findings in `spike-findings.md` (pass/fail per hypothesis).
126
+ - [ ] **Spike Fallback:** If reference media IDs are ignored, specify the fallback to degrade gracefully (using them only for UI catalog context, with warning logged).
127
+
128
+ **Gate:** ✅ MET (with redesign requirement). All hypotheses have observed answers.
129
+
130
+ **Spike outcome (2026-07-08):** Cards DO steer output (H1/H2/H3 confirmed) **but only
131
+ through the agent's reasoning path.** An imperative `"Generate N image(s): {prompt}"`
132
+ directive is passed to the image tool verbatim → brief ignored; a conversational
133
+ request → agent rewrites the tool prompt and injects enabled cards. **Load-bearing
134
+ consequence:** the transport made instructions inert on the CLI for TWO reasons
135
+ (both found live via the e2e; both fixed in this branch):
136
+ - `_compose_directive` used the imperative form → now conversational (`"Make me a picture of {prompt} …"`).
137
+ - `_reconcile_instructions` never set the brief-level **master switch**
138
+ `project_brief.enabled` (defaults OFF on a fresh project → all cards ignored) → now
139
+ PATCHes `updateMask=project_brief.enabled,project_brief.cards` with `enabled:true`.
140
+ - `_reconcile_instructions` content-type `application/json+protobuf` (silent 400)
141
+ → `text/plain`; response status now checked/warned.
142
+ - Per-card `title` hardcode → `AgentInstruction.title` + `resolved_title()`, via a
143
+ shared `build_agent_brief_cards()` used by both PATCH paths.
144
+ - `patch_agent_info` now returns the echoed `projectBrief` (no `GET /agentInfo`; it 404s).
145
+
146
+ **Live e2e (Task 9, done early):** `tests/e2e/test_live_agentic_instructions.py`
147
+ (`-m e2e_image`, `GFLOW_CLI_FORCE_AGENT_UI=1`) drives the real transport and was run
148
+ to a **verified crayon drawing** from a style-neutral prompt — cards steer output
149
+ end-to-end. Known follow-up: `GFLOW_CLI_FORCE_AGENT_UI` binding is ~50/50 flaky (may
150
+ bind classic and silently skip instructions). See `spike-findings.md`.
151
+
152
+ ---
153
+
154
+ ## Task 6 — `gflow instructions` Docs-First Spec (docs-first)
155
+
156
+ **What:** Write all user-facing documentation BEFORE implementing the subcommand.
157
+ The docs become the acceptance criteria for Task 7. This forces the design to be
158
+ coherent and agent-readable before a single implementation line is written.
159
+
160
+ **Design decisions locked in (do not reopen without a predict):**
161
+ - `-i "text"` on generation commands = ephemeral text-only card, always creates, never looks up.
162
+ - `gflow instructions` = persistent CRUD on project-scoped cards, supports refs and characters.
163
+ - No UUID inputs at the CLI; title matching is case-insensitive, fail-fast on ambiguity.
164
+ - `--project proj-id` on generation commands selects which project's active cards to use.
165
+ - Cards with `enabled: false` stay in the project but are ignored by the model.
166
+
167
+ **Files:**
168
+ - `docs/INSTRUCTIONS.md` — full user-facing guide: what instruction cards are, the
169
+ three-layer pipeline (setup → generate → compose), examples, movie context.
170
+ - `skills/gflow-cli/SKILL.md` — add a **Pipeline** section documenting the layered
171
+ sequence so AI agents always call setup before generation.
172
+ - `docs/USAGE.md` — add `gflow instructions` to the command surface section.
173
+ - `docs/INDEX.md` — register the new `INSTRUCTIONS.md` documentation file.
174
+ - `docs/superpowers/plans/2026-07-08-agentic-instructions/PLAN.md` — update this file
175
+ (Task 5b spec section).
176
+
177
+ **Steps:**
178
+ - [ ] Write `docs/INSTRUCTIONS.md` covering:
179
+ - What an instruction card is and why it is credits-free to set up.
180
+ - The three-layer pipeline: project context → generation → movie composition.
181
+ - Full `gflow instructions` command surface with annotated examples.
182
+ - Ephemeral `-i` vs persistent card distinction.
183
+ - `--project` flag semantics for generation commands.
184
+ - Typical agent-driven workflow (numbered steps, machine-readable).
185
+ - [ ] Update `skills/gflow-cli/SKILL.md` — add Pipeline section (with explicit project ID discovery guidance and "DO NOT" rules).
186
+ - [ ] Update `docs/USAGE.md` — add `gflow instructions` command surface entry.
187
+ - [ ] Update `docs/INDEX.md` — register link to `docs/INSTRUCTIONS.md`.
188
+ - [ ] Run `scripts/ci/check_doc_links.py` — all internal links must resolve.
189
+
190
+ **Gate:** Docs reviewed and approved before any Task 7 implementation starts.
191
+
192
+ ---
193
+
194
+ ## Task 7 — `gflow instructions` Subcommand Implementation (implementation)
195
+
196
+ **What:** Implement the `gflow instructions` Click subcommand group based on the
197
+ Task 6 spec. Strictly no scope creep — implement exactly what the docs say.
198
+
199
+ **Files:**
200
+ - `src/gflow_cli/cli_instructions.py` — new module with Click group + subcommands.
201
+ - `src/gflow_cli/cli.py` — register `gflow instructions` group.
202
+ - `src/gflow_cli/api/client.py` — add `get_agent_info()` for list/enable/disable lookups.
203
+ - `src/gflow_cli/cli_image.py` / `src/gflow_cli/cli_video.py` — add `--project` option.
204
+ - `tests/test_cli_instructions.py` — unit tests for all subcommands.
205
+ - `tests/features/instructions.feature` — BDD feature definitions for subcommands.
206
+ - `tests/features/test_instructions_steps.py` — BDD step definitions.
207
+
208
+ **Subcommands:**
209
+ ```
210
+ gflow instructions add TITLE --text TEXT [--ref PATH]... [--character ID]... [--project ID]
211
+ gflow instructions list [--project ID] [--json]
212
+ gflow instructions enable TITLE [--project ID]
213
+ gflow instructions disable TITLE [--project ID]
214
+ gflow instructions rm TITLE [--project ID]
215
+ gflow instructions apply FILE [--project ID] # declarative full-sync from TOML/JSON
216
+ gflow instructions toggle-mode [--on/--off] [--project ID] # toggle project-level Agentic mode
217
+ ```
218
+
219
+ **Steps:**
220
+ - [ ] Implement `get_agent_info(project_id)` client method returning a typed DTO (`ProjectBrief`).
221
+ - [ ] Implement `gflow instructions add` (upload refs → get media UUIDs → PATCH cards).
222
+ - [ ] Implement `gflow instructions list` with Rich table output and `--json` flag.
223
+ - [ ] Implement `gflow instructions enable` / `disable` (title match, case-insensitive, fail-fast).
224
+ - [ ] Implement `gflow instructions rm` (remove matching card, PATCH remaining).
225
+ - [ ] Implement `gflow instructions apply FILE` (declarative full-replace idempotent sync from TOML/JSON manifest).
226
+ - [ ] Implement `gflow instructions toggle-mode` (programmatic toggle of project-level Agentic mode).
227
+ - [ ] Add `--project proj-id` to `gflow image t2i` / `i2i` / `gflow video` commands.
228
+ - [ ] Gracefully handle classic UI projects in `gflow instructions` — fail-fast with clean HTTP error reporting.
229
+ - [ ] **UI Visual Consistency:** Ensure the driver's `configure_image_settings` clicks the `article_spark` button if the agent sidebar is closed, ensuring the browser Page visually reflects active cards.
230
+ - [ ] Ensure MCP schema symmetry: mirror all subcommands in MCP tool definitions (CI gate).
231
+ - [ ] Create `tests/features/instructions.feature` and verify CLI subcommands via BDD tests.
232
+ - [ ] All new commands covered by unit tests.
233
+ - [ ] Run `/gflow:check` — all gates green.
234
+
235
+ ---
236
+
237
+ ## Task 8 — Movie Manifest Integration (movie)
238
+
239
+ **What:** Integrate instruction card management into `gflow movie` so each scene can
240
+ declare its own instruction context declaratively in `movie.toml`.
241
+
242
+ **Files:**
243
+ - `src/gflow_cli/movie_manifest.py` — parse `[instructions]` and `[[scene.instructions]]` blocks.
244
+ - `src/gflow_cli/cli_movie.py` — inject `gflow instructions apply` step before each scene's generation.
245
+ - `docs/MOVIE.md` — document the `instructions` blocks in the manifest format.
246
+
247
+ **Steps:**
248
+ - [ ] Define `movie.toml` schema for global + per-scene instruction blocks:
249
+ ```toml
250
+ [instructions]
251
+ # Applied to all scenes unless overridden.
252
+ [[instructions.card]]
253
+ title = "Cinematic Lighting"
254
+ text = "Volumetric cinematic light from camera-left"
255
+ ref = "./refs/mood.jpg"
256
+ enabled = true
257
+
258
+ [[scene]]
259
+ prompt = "hero emerges from fog"
260
+ [scene.instructions]
261
+ disable = ["Cinematic Lighting"]
262
+ [[scene.instructions.card]]
263
+ title = "Fog Atmosphere"
264
+ text = "Dense volumetric fog, low contrast"
265
+ ```
266
+ - [ ] Implement manifest parser for the new blocks.
267
+ - [ ] Inject a pre-generation `PATCH agentInfo` call for each scene's instruction diff.
268
+ - [ ] Update `docs/MOVIE.md` with the new schema.
269
+ - [ ] BDD scenario: multi-scene movie with per-scene instruction override.
270
+
271
+ ---
272
+
273
+ ## Task 9 — E2E Verification (e2e)
274
+
275
+ **What:** Live integration test covering the full instructions lifecycle and a real
276
+ generation using the established context.
277
+
278
+ **Files:**
279
+ - `tests/e2e/test_live_agentic_instructions.py` — full create-patch-generate-teardown lifecycle.
280
+
281
+ **Steps:**
282
+ - [ ] Write `test_live_agentic_instructions.py`:
283
+ - Create a project.
284
+ - Add two instruction cards (one with a reference image).
285
+ - Enable one, disable the other.
286
+ - Generate one image (`gflow image t2i`).
287
+ - Assert generation succeeds and returns a valid `GeneratedImage`.
288
+ - Teardown: delete cards.
289
+ - [ ] Mark test `@pytest.mark.live` and `@pytest.mark.e2e`.
290
+ - [ ] Document run instructions in `docs/TESTING.md`.
291
+
292
+ ---
293
+
294
+ ## Task 10 — Re-assess and Optimize Developer Skills (skills audit)
295
+
296
+ **What:** Systematically review and update all agent skills to reflect the full
297
+ evolved architecture including the new instruction pipeline, `gflow instructions`
298
+ subcommand, and layered project context model.
299
+
300
+ **Files:**
301
+ - `skills/gflow-cli/SKILL.md` — primary update (Pipeline section added in Task 6).
302
+ - `skills/predict/SKILL.md`, `skills/scenario/SKILL.md`, `skills/plan/SKILL.md`,
303
+ `skills/status/SKILL.md`, `skills/pr-council-review/SKILL.md` — audit each.
304
+
305
+ **Steps:**
306
+ - [ ] Scan all skills and compare against current codebase: commands, transports, APIs, DTOs.
307
+ - [ ] Identify stale: legacy DOM transport descriptions, missing `gflow instructions`, old REST routes.
308
+ - [ ] Update each skill to correctly describe current components (SQLite ledger, daemon workers,
309
+ REST API, new `gflow instructions` subcommand, layered pipeline model).
310
+ - [ ] Verify all YAML frontmatter, internal links, and cross-references resolve correctly.
311
+ - [ ] Run `scripts/ci/check_doc_links.py` — merge gate.
312
+
313
+ ---
314
+
315
+ ## Definition of done
316
+
317
+ - [ ] All task steps checked off
318
+ - [ ] `/gflow:check` green (ruff / format / pyright / pytest ≥ 80% coverage)
319
+ - [ ] `CHANGELOG.md` `[Unreleased]` section updated
320
+ - [ ] `docs/INSTRUCTIONS.md` created and registered in `docs/INDEX.md`
321
+ - [ ] `skills/gflow-cli/SKILL.md` Pipeline section present
322
+ - [ ] `docs/USAGE.md` covers `gflow instructions` command surface
323
+ - [ ] `docs/MOVIE.md` documents `[instructions]` manifest blocks
324
+ - [ ] BDD feature files cover all scenarios (including CLI subcommands in `tests/features/instructions.feature`)
325
+ - [ ] MCP schema symmetry test passes (CI gate)
326
+ - [ ] Live spike findings documented in `spike-findings.md`
327
+ - [ ] Documented link check (`scripts/ci/check_doc_links.py`) passes without errors
328
+ - [ ] No `# TODO` in diff without a tracked issue link
329
+