gflow-cli 0.27.1__tar.gz → 0.29.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.
- gflow_cli-0.29.0/.claude/commands/gflow/check.md +78 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/AGENTS.md +4 -4
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/CHANGELOG.md +46 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/GEMINI.md +4 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/PKG-INFO +5 -4
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/README.md +3 -2
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/INDEX.md +4 -2
- gflow_cli-0.29.0/docs/INSTRUCTIONS.md +169 -0
- gflow_cli-0.29.0/docs/LIVE_VERIFICATION_v0.28.0.md +59 -0
- gflow_cli-0.29.0/docs/LIVE_VERIFICATION_v0.29.0.md +89 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/MCP.md +10 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/MOVIE.md +27 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/PROJECT_STATUS.md +19 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/USAGE.md +31 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/llms.txt +4 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/pyproject.toml +2 -2
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/gflow-cli/SKILL.md +32 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/pr-council-review/SKILL.md +27 -2
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/client.py +67 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/image.py +175 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/drivers/agentic.py +114 -8
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/drivers/factory.py +12 -8
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/ui_automation.py +78 -19
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/ui_automation_video.py +6 -5
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli.py +2 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_image.py +39 -2
- gflow_cli-0.29.0/src/gflow_cli/cli_instructions.py +754 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_movie.py +113 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/composition.py +19 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/mcp/tools.py +379 -5
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/movie_manifest.py +88 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/worker/daemon.py +39 -2
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client.py +113 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_image.py +218 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/drivers/test_agentic.py +166 -7
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/drivers/test_factory.py +2 -2
- gflow_cli-0.29.0/tests/api/transports/test_selector_symmetry.py +42 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_ui_automation.py +154 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_image.py +88 -0
- gflow_cli-0.29.0/tests/cli/test_cli_instructions.py +402 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_movie.py +104 -1
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_tools.py +6 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_movie_manifest.py +46 -0
- gflow_cli-0.29.0/tests/e2e/test_live_agentic_instructions.py +132 -0
- gflow_cli-0.29.0/tests/features/instructions.feature +22 -0
- gflow_cli-0.29.0/tests/features/test_instructions_steps.py +263 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_video_agent_ui_steps.py +253 -3
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/video_agent_ui.feature +24 -1
- gflow_cli-0.29.0/tests/mcp/test_cli_parity.py +127 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/mcp/test_server.py +1 -1
- gflow_cli-0.29.0/tests/mcp/test_tools_instructions.py +251 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/worker/test_daemon.py +46 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/uv.lock +11 -11
- gflow_cli-0.27.1/.claude/commands/gflow/check.md +0 -59
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/README.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.env.template +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.gitattributes +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.gitignore +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/.secrets.baseline +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/CLAUDE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/LICENSE +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/RELEASE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/ROADMAP.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docker-compose.yml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/README.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/README.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/README.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/sonar-project.properties +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_config.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_media.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.27.1 → gflow_cli-0.29.0}/tests/ui/test_app.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`, `
|
|
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),
|
|
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–
|
|
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,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.29.0] — 2026-07-09
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **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`).
|
|
15
|
+
- **Declarative full-sync:** `gflow instructions apply FILE` for idempotent sync of instructions from TOML or JSON brief files.
|
|
16
|
+
- **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).
|
|
17
|
+
- **`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).
|
|
18
|
+
- **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.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- **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.
|
|
23
|
+
|
|
24
|
+
### Internal
|
|
25
|
+
|
|
26
|
+
- **`/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.
|
|
27
|
+
|
|
28
|
+
## [0.28.0] — 2026-07-08
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- **Agent instructions (`-i` / `--instruction`) now actually steer generation.** On an
|
|
33
|
+
agentic-cohort Flow session, `gflow image t2i "…" -i "Every image is a flat 2D crayon
|
|
34
|
+
drawing"` makes the agent adopt that style (live-verified end-to-end). Instruction cards are
|
|
35
|
+
synced to the project's Agent brief via `PATCH /v1/projects/{id}/agentInfo`, and the agent
|
|
36
|
+
folds every **enabled** card into the generation. Cards carry distinct titles and may
|
|
37
|
+
reference image assets. Persistent CRUD (`gflow instructions`) and movie-manifest wiring are
|
|
38
|
+
planned follow-ups.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- **Instructions were silently inert (agentic transport).** Two root causes, both found via a
|
|
43
|
+
live spike: (1) the composer used an imperative `"Generate N images: …"` directive that the
|
|
44
|
+
agent passes to the image tool verbatim, bypassing the brief — now phrased conversationally
|
|
45
|
+
so the agent's reasoning step applies the cards; (2) the brief-level master switch
|
|
46
|
+
`project_brief.enabled` was never set (defaults off on a fresh project → all cards ignored) —
|
|
47
|
+
now enabled whenever cards are synced. Also fixes a wrong PATCH content-type
|
|
48
|
+
(`application/json+protobuf` → HTTP 400, silently) and a hardcoded per-card title that
|
|
49
|
+
collapsed every card to one name.
|
|
50
|
+
- **`-i` no longer no-ops without warning on a classic-cohort session:** a clear warning is now
|
|
51
|
+
emitted (instructions only apply on agentic sessions).
|
|
52
|
+
|
|
10
53
|
## [0.27.1] — 2026-07-07
|
|
11
54
|
|
|
12
55
|
### Fixed
|
|
@@ -1844,7 +1887,9 @@ shell-script template that branches on these codes.
|
|
|
1844
1887
|
|
|
1845
1888
|
First skeleton. Not functional end-to-end yet.
|
|
1846
1889
|
|
|
1847
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1890
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.29.0...HEAD
|
|
1891
|
+
[0.29.0]: https://github.com/ffroliva/gflow-cli/compare/v0.28.0...v0.29.0
|
|
1892
|
+
[0.28.0]: https://github.com/ffroliva/gflow-cli/compare/v0.27.1...v0.28.0
|
|
1848
1893
|
[0.27.1]: https://github.com/ffroliva/gflow-cli/compare/v0.27.0...v0.27.1
|
|
1849
1894
|
[0.27.0]: https://github.com/ffroliva/gflow-cli/compare/v0.26.0...v0.27.0
|
|
1850
1895
|
[0.26.0]: https://github.com/ffroliva/gflow-cli/compare/v0.25.0...v0.26.0
|
|
@@ -25,7 +25,10 @@
|
|
|
25
25
|
|
|
26
26
|
## Active phase
|
|
27
27
|
|
|
28
|
+
- **Agentic Instructions Implementation (Completed - PR #269):** Programmatic, API-driven, and relational instructions management system in the Google Flow Agentic transport (CRUD commands, TOML/JSON declarative sync, and movie manifest global/per-scene card overrides with pre-generation briefs patching).
|
|
28
29
|
- **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).
|
|
29
|
-
- **Core Lesson (Retrospective):**
|
|
30
|
+
- **Core Lesson (Retrospective):**
|
|
31
|
+
- Kept `gflow-cli` strictly headless (running Uvicorn and FastMCP over localhost HTTP/SSE). Bypassed browser context locks by serializing task writes in SQLite queue, allowing parallel client database reads via WAL mode.
|
|
32
|
+
- Relational instruction cards steering generations through the reasoning path must be phrased conversationally (imperative prompts bypass the brief). Multi-scene movie instructions syncing is read-modify-write to preserve server-assigned card IDs and prevent title/ID collisions.
|
|
30
33
|
|
|
31
34
|
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.
|
|
3
|
+
Version: 0.29.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.
|
|
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
|
|
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`.
|
|
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
|
|
|
@@ -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
|
|
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`.
|
|
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/
|
|
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.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.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,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.
|
|
@@ -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.
|