gflow-cli 0.20.1__tar.gz → 0.21.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.20.1 → gflow_cli-0.21.0}/.env.template +11 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/ci.yml +17 -3
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/governance-advisory.yml +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/governance-benchmark.yml +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/release.yml +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.gitignore +1 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/AGENTS.md +2 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CHANGELOG.md +19 -1
- gflow_cli-0.21.0/GEMINI.md +31 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/PKG-INFO +43 -40
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/PLAN.md +16 -1
- gflow_cli-0.21.0/README.md +143 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/ROADMAP.md +7 -6
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/INDEX.md +2 -1
- gflow_cli-0.21.0/docs/LIVE_VERIFICATION_v0.21.0.md +66 -0
- gflow_cli-0.21.0/docs/MCP.md +173 -0
- gflow_cli-0.21.0/docs/assets/example-run.gif +0 -0
- gflow_cli-0.21.0/docs/assets/examples.webp +0 -0
- gflow_cli-0.21.0/docs/medium_tutorial.md +80 -0
- gflow_cli-0.21.0/docs/sonar-cleanup-tracker.md +81 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +177 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +69 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +67 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +146 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +56 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +60 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +117 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +110 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +66 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +233 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +94 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +78 -0
- gflow_cli-0.21.0/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +571 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/pyproject.toml +8 -3
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/character.py +52 -49
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/client.py +88 -42
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/agentic.py +11 -6
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/classic.py +4 -4
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/factory.py +3 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/ui_automation.py +87 -59
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/ui_automation_video.py +298 -212
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/video.py +26 -16
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/browser_manager.py +14 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/chain.py +89 -51
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/chain_manifest.py +38 -32
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli.py +132 -20
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_image.py +123 -85
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_movie.py +156 -100
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_scene.py +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_video.py +243 -146
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/composition.py +101 -62
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/config.py +19 -1
- gflow_cli-0.21.0/src/gflow_cli/data/migrations/0007_queue.sql +14 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/recorder.py +148 -99
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/errors.py +8 -0
- gflow_cli-0.21.0/src/gflow_cli/mcp/__init__.py +12 -0
- gflow_cli-0.21.0/src/gflow_cli/mcp/prompts.py +74 -0
- gflow_cli-0.21.0/src/gflow_cli/mcp/resources.py +94 -0
- gflow_cli-0.21.0/src/gflow_cli/mcp/server.py +160 -0
- gflow_cli-0.21.0/src/gflow_cli/mcp/tools.py +263 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/movie_manifest.py +226 -139
- gflow_cli-0.21.0/src/gflow_cli/ui/app.py +151 -0
- gflow_cli-0.21.0/src/gflow_cli/ui/server.py +16 -0
- gflow_cli-0.21.0/src/gflow_cli/worker/daemon.py +254 -0
- gflow_cli-0.21.0/src/gflow_cli/worker/queue.py +179 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_store_migrations.py +9 -1
- gflow_cli-0.21.0/tests/e2e/test_daemon_e2e.py +143 -0
- gflow_cli-0.21.0/tests/mcp/__init__.py +1 -0
- gflow_cli-0.21.0/tests/mcp/conftest.py +15 -0
- gflow_cli-0.21.0/tests/mcp/test_server.py +438 -0
- gflow_cli-0.21.0/tests/mcp/test_stdio_transport.py +106 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_config.py +30 -0
- gflow_cli-0.21.0/tests/ui/test_app.py +137 -0
- gflow_cli-0.21.0/tests/worker/test_daemon.py +284 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/uv.lock +463 -82
- gflow_cli-0.20.1/GEMINI.md +0 -28
- gflow_cli-0.20.1/README.md +0 -144
- gflow_cli-0.20.1/docs/assets/example-run.gif +0 -0
- gflow_cli-0.20.1/scripts/dev/record_flow_capture.py +0 -271
- gflow_cli-0.20.1/tests/dev/test_record_flow_capture.py +0 -88
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.gitattributes +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/.secrets.baseline +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CLAUDE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/LICENSE +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/RELEASE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docker-compose.yml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/USAGE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/llms.txt +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/sonar-project.properties +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_media.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.21.0}/tests/test_smoke.py +0 -0
|
@@ -129,3 +129,14 @@
|
|
|
129
129
|
# scripts/dev/capture_locale_invariants.py or to live-verify a non-EN
|
|
130
130
|
# language end-to-end (see KNOWN_ISSUES § issue #24).
|
|
131
131
|
# GFLOW_CLI_LOCALE=en-US
|
|
132
|
+
|
|
133
|
+
# -----------------------------------------------------------------------------
|
|
134
|
+
# Headless Daemon (gflow serve)
|
|
135
|
+
# -----------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
# API Token header for gflow serve authentication (required when binding to non-local interface, e.g. 0.0.0.0).
|
|
138
|
+
# GFLOW_DAEMON_TOKEN=
|
|
139
|
+
|
|
140
|
+
# Port for gflow serve. Default is 8000.
|
|
141
|
+
# GFLOW_DAEMON_PORT=8000
|
|
142
|
+
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
name: Secret scan (gitleaks)
|
|
17
17
|
runs-on: ubuntu-latest
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 0 # full history so gitleaks can diff against base
|
|
22
22
|
|
|
@@ -25,6 +25,20 @@ jobs:
|
|
|
25
25
|
env:
|
|
26
26
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
27
27
|
|
|
28
|
+
# ── Security gate: dependency CVE audit against locked deps ──────────────
|
|
29
|
+
deps-audit:
|
|
30
|
+
name: Dependency audit (pip-audit)
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v7
|
|
34
|
+
- name: Install uv
|
|
35
|
+
uses: astral-sh/setup-uv@v7
|
|
36
|
+
- name: Audit locked dependencies for known CVEs
|
|
37
|
+
# Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
|
|
38
|
+
run: |
|
|
39
|
+
uv export --frozen --format requirements-txt --no-emit-project > requirements-audit.txt
|
|
40
|
+
uvx pip-audit -r requirements-audit.txt
|
|
41
|
+
|
|
28
42
|
# ── Main test matrix ──────────────────────────────────────────────────────
|
|
29
43
|
test:
|
|
30
44
|
runs-on: ubuntu-latest
|
|
@@ -32,7 +46,7 @@ jobs:
|
|
|
32
46
|
matrix:
|
|
33
47
|
python-version: ["3.11", "3.12", "3.13"]
|
|
34
48
|
steps:
|
|
35
|
-
- uses: actions/checkout@
|
|
49
|
+
- uses: actions/checkout@v7
|
|
36
50
|
|
|
37
51
|
- name: Install uv
|
|
38
52
|
uses: astral-sh/setup-uv@v7
|
|
@@ -88,7 +102,7 @@ jobs:
|
|
|
88
102
|
github.event.pull_request.head.repo.full_name == github.repository
|
|
89
103
|
)
|
|
90
104
|
steps:
|
|
91
|
-
- uses: actions/checkout@
|
|
105
|
+
- uses: actions/checkout@v7
|
|
92
106
|
with:
|
|
93
107
|
fetch-depth: 0 # shallow clones break blame / new-code detection
|
|
94
108
|
|
|
@@ -58,6 +58,7 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
58
58
|
- Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
|
|
59
59
|
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
|
|
60
60
|
- 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
|
|
61
|
+
- **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_server.py`.
|
|
61
62
|
|
|
62
63
|
## PR instructions
|
|
63
64
|
|
|
@@ -80,7 +81,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
|
|
|
80
81
|
| `status` | [`skills/status/SKILL.md`](skills/status/SKILL.md) | Show current plan state, progress, and next unchecked task |
|
|
81
82
|
| `pr-council-review` | [`skills/pr-council-review/SKILL.md`](skills/pr-council-review/SKILL.md) | Multi-dimensional PR council review |
|
|
82
83
|
|
|
83
|
-
**Cursor / Aider / Codex / Gemini CLI:** paste or include the relevant `SKILL.md` in your system context.
|
|
84
|
+
**Cursor / Aider / Codex / Gemini CLI (`agy`):** paste or include the relevant `SKILL.md` in your system context. Note: in the `agy` TUI prompt, custom slash commands (e.g. `/gflow:pr-council-review`) are blocked by the TUI's command parser. Type them as plain text without the leading slash (e.g. `gflow:pr-council-review`, `gflow:branch-review`, or `gflow:check`) to trigger the corresponding agent skill workflow.
|
|
84
85
|
**Claude Code:** the `/gflow:` slash commands in `.claude/commands/gflow/` are auto-discovered when the project is open — no extra setup needed. To register a skill globally, copy the command file to `~/.claude/commands/`.
|
|
85
86
|
**Custom agents:** fetch `skills/gflow-cli/SKILL.md` into your knowledge base before answering gflow questions.
|
|
86
87
|
|
|
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.21.0] — 2026-06-26
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **MCP server** (`gflow mcp run`): a [Model Context Protocol](https://modelcontextprotocol.io) server over **stdio** that exposes gflow's image / video / data operations to MCP-aware agents (Claude Desktop, Cursor, VS Code) as JSON-RPC **tools, resources, and prompts**. Point the client at `gflow mcp run` (example config in `gflow mcp run --help` and [docs/MCP.md](docs/MCP.md)). `gflow mcp setup --target <claude-desktop|cursor|vscode>` is scaffolded for future auto-configuration.
|
|
15
|
+
- **MCP over HTTP/SSE** (`gflow serve`): serves the same MCP server over Server-Sent Events — stream at `/sse`, POST messages to `/messages/`. Binds `127.0.0.1:8000` by default; non-loopback binds require `GFLOW_DAEMON_TOKEN`. Foundation for the forthcoming Gflow Studio Web UI and REST `/api/v1` surface.
|
|
16
|
+
- **Daemon & generation-queue scaffolding** (internal foundation): a FastAPI lifespan daemon, a `FlowWorker` background processor, and a SQLite-backed generation queue (`QueueRepository` + migration `0007_queue`, swept to `failed` on restart). Lays the groundwork for queued asynchronous generation; not yet wired into a user command (`gflow serve` currently runs the MCP/SSE server only).
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **Security — `cryptography` advisory** ([GHSA-537c-gmf6-5ccf](https://github.com/advisories/GHSA-537c-gmf6-5ccf)): bumped the locked `cryptography` from 48.0.0 to 49.0.0 (transitive dependency).
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- **CI — dependency CVE gate**: added a `pip-audit` job that audits the locked dependency set on every PR and fails on known advisories.
|
|
25
|
+
- **Code health**: SonarCloud cleanup sweep across the CLI, API, transport drivers, and movie/manifest layers (cognitive-complexity, duplicate-literal, and unused-argument refactors) with no behavioral change.
|
|
26
|
+
|
|
10
27
|
## [0.20.1] — 2026-06-16
|
|
11
28
|
|
|
12
29
|
### Fixed
|
|
@@ -1565,7 +1582,8 @@ shell-script template that branches on these codes.
|
|
|
1565
1582
|
|
|
1566
1583
|
First skeleton. Not functional end-to-end yet.
|
|
1567
1584
|
|
|
1568
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1585
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...HEAD
|
|
1586
|
+
[0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
|
|
1569
1587
|
[0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
|
|
1570
1588
|
[0.20.0]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...v0.20.0
|
|
1571
1589
|
[0.19.0]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...v0.19.0
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# GEMINI.md
|
|
2
|
+
|
|
3
|
+
> Project memory hub for **Gemini CLI**. The universal coding-agent rules for any tool (Cursor, Codex, Aider, Gemini CLI, etc.) live in [AGENTS.md](AGENTS.md) — this file carries Gemini-specific session protocol only.
|
|
4
|
+
|
|
5
|
+
## What this project is
|
|
6
|
+
|
|
7
|
+
`gflow-cli` is an unofficial Python CLI that drives [Google Flow](https://labs.google/fx/tools/flow) (Veo image-to-video, Imagen text-to-image) from the terminal by reverse-engineering Flow's private REST API. See [README.md](README.md) for the user-facing overview.
|
|
8
|
+
|
|
9
|
+
## On every session start
|
|
10
|
+
|
|
11
|
+
1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
|
|
12
|
+
2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
|
|
13
|
+
3. Pull deeper context on demand (type as plain text in the `agy` TUI prompt):
|
|
14
|
+
- Current task / where we left off → `gflow:status`
|
|
15
|
+
- Starting a new feature → `gflow:predict` → `gflow:scenario` → `gflow:plan <feature>`
|
|
16
|
+
- Touching auth or reCAPTCHA → `gflow:known-issues`
|
|
17
|
+
- Cutting a release → `gflow:release`
|
|
18
|
+
- Before any commit → `gflow:check`
|
|
19
|
+
|
|
20
|
+
## Gemini-specific
|
|
21
|
+
|
|
22
|
+
- Use specialized skills when relevant (e.g., `find-docs` for library research, `pr-council-review` for PR audits).
|
|
23
|
+
- Maintain memory via the `mcp-mempalace` tool if available.
|
|
24
|
+
- Prioritize **turn efficiency** and **high-signal output**.
|
|
25
|
+
|
|
26
|
+
## Active phase
|
|
27
|
+
|
|
28
|
+
- **Decoupled Daemon/Worker Plan:** The blueprint for the headless SSE Daemon, SQLite generation queue, and Tauri/React editor is scheduled in [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md) and [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md).
|
|
29
|
+
- **Core Lesson (Retrospective):** Kept `gflow-cli` strictly headless (running Uvicorn and FastMCP over localhost HTTP/SSE). Bypassed browser context locks by serializing task writes in SQLite queue, allowing parallel client database reads via WAL mode.
|
|
30
|
+
|
|
31
|
+
See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.21.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
|
|
@@ -39,13 +39,17 @@ Classifier: Topic :: Multimedia :: Video
|
|
|
39
39
|
Requires-Python: >=3.11
|
|
40
40
|
Requires-Dist: browser-cookie3>=0.20.1
|
|
41
41
|
Requires-Dist: click>=8.1.0
|
|
42
|
+
Requires-Dist: fastapi>=0.115.0
|
|
42
43
|
Requires-Dist: httpx>=0.27.0
|
|
44
|
+
Requires-Dist: mcp>=1.0.0
|
|
43
45
|
Requires-Dist: platformdirs>=4.0.0
|
|
44
46
|
Requires-Dist: playwright>=1.45.0
|
|
45
47
|
Requires-Dist: pydantic-settings>=2.5.0
|
|
46
48
|
Requires-Dist: rich>=13.7.0
|
|
49
|
+
Requires-Dist: sse-starlette>=2.0.0
|
|
47
50
|
Requires-Dist: structlog>=24.0.0
|
|
48
51
|
Requires-Dist: tenacity>=8.2
|
|
52
|
+
Requires-Dist: uvicorn[standard]>=0.34.0
|
|
49
53
|
Provides-Extra: chain
|
|
50
54
|
Requires-Dist: av>=12; extra == 'chain'
|
|
51
55
|
Provides-Extra: dev
|
|
@@ -54,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
|
54
58
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
55
59
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
56
60
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
57
|
-
Requires-Dist: ruff
|
|
61
|
+
Requires-Dist: ruff==0.15.18; extra == 'dev'
|
|
58
62
|
Provides-Extra: gcs
|
|
59
63
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
60
64
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
@@ -67,7 +71,7 @@ Description-Content-Type: text/markdown
|
|
|
67
71
|
|
|
68
72
|
# gflow-cli
|
|
69
73
|
|
|
70
|
-
>
|
|
74
|
+
> Unofficial Python CLI for Google Flow. Drive [Veo](https://labs.google/fx/tools/flow) (image-to-video, text-to-video) and Imagen (text-to-image) from your terminal: scripted, batched, pipeline-ready.
|
|
71
75
|
|
|
72
76
|
[](https://pypi.org/project/gflow-cli/)
|
|
73
77
|
[](https://github.com/ffroliva/gflow-cli/actions/workflows/ci.yml)
|
|
@@ -80,26 +84,25 @@ Description-Content-Type: text/markdown
|
|
|
80
84
|
[](CONTRIBUTING.md)
|
|
81
85
|
[](https://sonarcloud.io/summary/new_code?id=ffroliva_gflow-cli)
|
|
82
86
|
|
|
83
|
-
> ⚠️ **Unofficial
|
|
87
|
+
> ⚠️ **Unofficial, reverse-engineered, not affiliated with Google.** Endpoints can change without notice. Read the full [DISCLAIMER](DISCLAIMER.md).
|
|
84
88
|
>
|
|
85
|
-
> 🌐 **Headed
|
|
86
|
-
|
|
89
|
+
> 🌐 **Headed browser today.** gflow drives Flow through a persistent Playwright Chromium profile, because Google's auth and reCAPTCHA gates require it. The [Architecture](#architecture--current-limitations) section shows where you can help.
|
|
87
90
|
|
|
88
91
|
## Why gflow-cli?
|
|
89
92
|
|
|
90
|
-
|
|
93
|
+
You pay for Google AI Ultra or Pro, you have Veo credits, and you run real batch work. gflow-cli gives you:
|
|
91
94
|
|
|
92
|
-
- **
|
|
93
|
-
- **
|
|
94
|
-
- **
|
|
95
|
-
- **
|
|
95
|
+
- **Batch generation.** Loop prompts straight from the shell: `for p in $(cat prompts.txt); do gflow image t2i "$p"; done`. Image batching plus `gflow video t2v` / `i2v` / `r2v` all ship today.
|
|
96
|
+
- **Consistent subjects.** `gflow character create` mints a Flow Character (face and body reference) so the same person appears from one generation to the next.
|
|
97
|
+
- **Pipelines.** Wire Veo into your content automation, AI-video stack, or batch experiments.
|
|
98
|
+
- **Terminal-native.** After one `gflow auth login`, you stay in the shell. No clicking through dialogs.
|
|
96
99
|
|
|
97
|
-
Same Veo
|
|
100
|
+
Same Veo and Imagen models, same quality, same Ultra/Pro billing, now programmatic.
|
|
98
101
|
|
|
99
102
|
## 60-second quick start
|
|
100
103
|
|
|
101
104
|
```bash
|
|
102
|
-
# 1 · Install (uv recommended
|
|
105
|
+
# 1 · Install (uv recommended; also: pip install gflow-cli)
|
|
103
106
|
uv tool install gflow-cli
|
|
104
107
|
uv tool run --from gflow-cli playwright install chromium # one-time, ~150 MB
|
|
105
108
|
|
|
@@ -114,26 +117,25 @@ gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16
|
|
|
114
117
|
gflow character create --project <id> --name "Aria" --face-prompt "..." --body-prompt "..."
|
|
115
118
|
```
|
|
116
119
|
|
|
117
|
-
Outputs land under `$GFLOW_CLI_OUTPUT_DIR`
|
|
118
|
-
[`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md) sends generated assets to
|
|
119
|
-
S3, MinIO, or Google Cloud Storage. First call is ~30–90 s while Chromium warms;
|
|
120
|
-
subsequent calls reuse the warm session.
|
|
120
|
+
Outputs land under `$GFLOW_CLI_OUTPUT_DIR`, or you can route them to S3, MinIO, or Google Cloud Storage with [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md). The first call takes 30 to 90 seconds while Chromium warms up; later calls reuse the warm session.
|
|
121
121
|
|
|
122
122
|
> **Why `--browser chrome`?** Google rejects Playwright's bundled Chromium. The CLI fails fast with a friendly error (`AuthBrowserRejectedError`, exit code 14) if you pick anything else.
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
For the full 10-minute walkthrough with troubleshooting and multi-account setup, see **[USER_GUIDE: Journey 1](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)**.
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
## Examples
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
One command in, real Flow output back. Left: `gflow image t2i` generating a photorealistic scene in your library. Right: a frame-to-frame transform.
|
|
129
|
+
|
|
130
|
+

|
|
129
131
|
|
|
130
|
-
|
|
132
|
+
## Demo
|
|
131
133
|
|
|
132
|
-
|
|
134
|
+

|
|
133
135
|
|
|
134
|
-
|
|
136
|
+
A single `gflow image t2i "..." --aspect 9:16 --model nano2` call against a logged-in Pro/Ultra profile. The terminal streams the run's `structlog` JSON, then lists the written PNG. Chromium drives the Flow editor silently in the background.
|
|
135
137
|
|
|
136
|
-
|
|
138
|
+
Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (Windows, OBS, ffmpeg, gifski). More formats, including the side-by-side split-screen: **[docs/DEMOS.md](docs/DEMOS.md)**.
|
|
137
139
|
|
|
138
140
|
## Documentation
|
|
139
141
|
|
|
@@ -143,25 +145,24 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
|
|
|
143
145
|
|---|---|
|
|
144
146
|
| 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
|
|
145
147
|
| **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
|
|
146
|
-
| 🎭 **Characters** | [Characters](docs/CHARACTER.md)
|
|
148
|
+
| 🎭 **Characters** | [Characters](docs/CHARACTER.md), reusable subjects (`gflow character`) |
|
|
147
149
|
| 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
|
|
148
|
-
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
150
|
+
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
149
151
|
| 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
|
|
150
152
|
| 🤝 **Contributing** | [Contributing](CONTRIBUTING.md) · [Development](docs/DEVELOPMENT.md) · [GitHub workflow](docs/GITHUB.md) |
|
|
151
153
|
|
|
152
|
-
|
|
153
154
|
## For AI agents & LLMs
|
|
154
155
|
|
|
155
|
-
gflow-cli ships three agent entry points
|
|
156
|
+
gflow-cli ships three agent entry points. Pick the one your tool reads first.
|
|
156
157
|
|
|
157
158
|
| File | Audience | Tools |
|
|
158
159
|
|---|---|---|
|
|
159
|
-
| [**AGENTS.md**](AGENTS.md) | Universal coding-agent spec | Cursor · Codex · Aider · Gemini CLI · Jules · Devin · Windsurf · Zed · Warp · opencode · Copilot
|
|
160
|
+
| [**AGENTS.md**](AGENTS.md) | Universal coding-agent spec | Cursor · Codex · Aider · Gemini CLI · Jules · Devin · Windsurf · Zed · Warp · opencode · Copilot |
|
|
160
161
|
| [**CLAUDE.md**](CLAUDE.md) | Claude Code's auto-loaded memory | Claude Code |
|
|
161
|
-
| [**llms.txt**](llms.txt) | LLM-readable summary (llmstxt.org format) | Paste into ChatGPT
|
|
162
|
+
| [**llms.txt**](llms.txt) | LLM-readable summary (llmstxt.org format) | Paste into ChatGPT, Claude, or Gemini to onboard the model |
|
|
162
163
|
| [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md) | Claude Code Skill | Symlink into `~/.claude/skills/` |
|
|
163
164
|
|
|
164
|
-
|
|
165
|
+
Onboard any agent in one line. Paste this into your agent of choice:
|
|
165
166
|
|
|
166
167
|
> *"Read [AGENTS.md](https://github.com/ffroliva/gflow-cli/blob/main/AGENTS.md) and [docs/INDEX.md](https://github.com/ffroliva/gflow-cli/blob/main/docs/INDEX.md), then help me with my Flow batch."*
|
|
167
168
|
|
|
@@ -175,25 +176,27 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
|
|
|
175
176
|
aisandbox-pa.googleapis.com (Google's private Flow API)
|
|
176
177
|
```
|
|
177
178
|
|
|
178
|
-
**Current transport:** `ui_automation`
|
|
179
|
+
**Current transport:** `ui_automation` drives Flow through a persistent Playwright Chromium profile. It is production-stable and verified end-to-end every release (see the per-release `LIVE_VERIFICATION_*` evidence files).
|
|
179
180
|
|
|
180
|
-
**What's blocked:**
|
|
181
|
+
**What's blocked:** a pure HTTP transport for video generation. The video upload endpoint returns HTTP 401 under non-Chrome browsers plus a reCAPTCHA mint we cannot reproduce headlessly. Three earlier HTTP strategies (`evaluate_fetch`, `bearer`, `sapisidhash`) live under `src/gflow_cli/api/transports/experimental/` for research, off the production path.
|
|
181
182
|
|
|
182
|
-
**How you can help:**
|
|
183
|
+
**How you can help:** if you have driven `aisandbox-pa.googleapis.com` from outside a real Chrome session, or you understand Google's anti-bot stack here, please open an issue. A working REST transport would unlock serverless deployments, true horizontal concurrency, and roughly 10x the project's reach. Details: [docs/ARCHITECTURE.md § Headed-browser dependency](docs/ARCHITECTURE.md#headed-browser-dependency--current-limitation).
|
|
183
184
|
|
|
184
185
|
## Project status
|
|
185
186
|
|
|
186
|
-
**
|
|
187
|
+
**Alpha.** Image (t2i, i2i, upload) and video (t2v, i2v, r2v) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Recent additions: `gflow character` for reusable subjects, `gflow scene` for credit-free server-side stitching, and `gflow video chain` for linked clips. Video `batch` is still queued for Phase B, so use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)).
|
|
188
|
+
|
|
189
|
+
Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project is heading: [ROADMAP.md](ROADMAP.md).
|
|
187
190
|
|
|
188
191
|
## License & legal
|
|
189
192
|
|
|
190
|
-
[MIT License](LICENSE) © 2026 Flavio Oliva (`ffroliva`). The MIT license covers `gflow-cli`'s code only
|
|
193
|
+
[MIT License](LICENSE) © 2026 Flavio Oliva (`ffroliva`). The MIT license covers `gflow-cli`'s code only. It grants no rights to Flow, Veo model output, or any Google service. Google's own terms (Labs Additional Terms, Ultra/Pro subscription terms) govern your generations. See the [DISCLAIMER](DISCLAIMER.md).
|
|
191
194
|
|
|
192
195
|
## Acknowledgements
|
|
193
196
|
|
|
194
|
-
- [`edge-tts`](https://github.com/rany2/edge-tts)
|
|
195
|
-
- [`googleapis/python-genai`](https://github.com/googleapis/python-genai)
|
|
196
|
-
- [Keysight
|
|
197
|
+
- [`edge-tts`](https://github.com/rany2/edge-tts), design inspiration for community SDKs over private cloud APIs.
|
|
198
|
+
- [`googleapis/python-genai`](https://github.com/googleapis/python-genai), the official Veo SDK that a future provider release may alias.
|
|
199
|
+
- [Keysight, *Google Labs – Flow AI with Veo3: A Network Traffic Analysis*](https://www.keysight.com/blogs/en/tech/nwvs/2025/08/04/google-flow-ai-har-analysis), an independent capture that helped validate the route patterns.
|
|
197
200
|
|
|
198
201
|
---
|
|
199
202
|
|
|
@@ -208,4 +211,4 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
|
|
|
208
211
|
[](https://github.com/ffroliva/gflow-cli)
|
|
209
212
|
[](https://pepy.tech/project/gflow-cli)
|
|
210
213
|
|
|
211
|
-
If `gflow-cli` saves you time, please ⭐ the repo
|
|
214
|
+
If `gflow-cli` saves you time, please ⭐ the repo. It is the cheapest way to support the project.
|
|
@@ -358,7 +358,9 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
|
|
|
358
358
|
- **Phase 3 (PR #90 / [#63](https://github.com/ffroliva/gflow-cli/issues/63), 2026-05-26, develop `9a0896a8`):** replaced `FRAME_SLOTS_STRUCT` with the locale-free pattern `div[type='button'][aria-haspopup='dialog']` (verified via DOM probe — matches exactly 2). Also fixed the End-frame OOB index after Start is attached. **I2V live-proof on de-DE: 124 s, mp4 with `ftyp` magic bytes, both `frame_attached` events fired (Start + End).**
|
|
359
359
|
- **Phase 4 (Task #6, 2026-05-26, branch `claude/next-quick-win-gBPqS`, PR #93):** `NEW_PROJECT_SELECTORS` expanded to all 14 locales (icon-first tier + 14-locale text tier); English-only ARIA fallbacks (`[aria-label*='New project']`, `[aria-label*='Project']`) removed. `SUBMIT_BUTTON_SELECTORS` drops its English-only `button[aria-label*="Create"]` entry — `arrow_forward` icon selectors cover it in all locales. Both tuples are now fully locale-invariant. Note: issue #24 was closed 2026-05-24 after Phases 1–3; Phase 4 is cosmetic tail work. `--lang=en-US` retained only to stabilise `IMAGE_MODEL_OPTION_SELECTORS` (product names like "Nano Banana 2" may be localised). Removing it requires converting the image model picker to a structural anchor — tracked as issue #94 (Phase 5 below). **R2V live e2e on non-EN not yet exercised** — still open.
|
|
360
360
|
- **Phase 5 (2026-05-30, branch `claude/issue-94-staleness-check-MnsEY`, PR #127):** `IMAGE_MODEL_OPTION_SELECTORS` and `VIDEO_MODEL_OPTION_SELECTORS` converted from `dict[Model, str]` to `dict[Model, tuple[str, ...]]` (cascade discipline; Tier 1 structural slots reserved for future DOM-probe-confirmed anchors). `--lang=en-US` removed from Chromium launch args — locale controlled by `locale=locale_env` Playwright kwarg (persists across all navigations including `/project/<uuid>` deep-links) + `FLOW_URL`'s `?hl=en` on initial load. Branded model names confirmed locale-stable. Four new `TestSelectorLocaleInvariance` tests + four `TestSelectImageModel` runtime tests. **R2V live e2e on non-EN still pending (owner gate — requires authenticated non-EN Chrome profile).**
|
|
361
|
-
- [ ] **Model Context Protocol (MCP) Server.** (Backlog) Expose core gflow-cli tools via MCP for language-agnostic agentic access.
|
|
361
|
+
- [ ] **Model Context Protocol (MCP) Server.** (Backlog) Expose core gflow-cli tools via MCP for language-agnostic agentic access. Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md).
|
|
362
|
+
- [ ] **Prompt Expansion ("Creative Director" mode).** (Backlog) Add an option to expand prompts using Google's official 5-component formula via Gemini. Planned in [PREDICT.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md) / [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md).
|
|
363
|
+
- [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog) Port google-flow-worker, construct a local FastAPI/React filmmaking studio dashboard, and support HTTP/SSE MCP. Planned in [DESIGN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md) / [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md).
|
|
362
364
|
- [x] **Issue #92: Google account identity persistence shipped 2026-05-28 (PR #110).** After every `gflow auth login`, both auth strategies write the verified email to `$GFLOW_CLI_HOME/profile_<name>/.gflow_account`. `ProfileMeta.google_account` surfaces it; `gflow auth list` and `gflow auth list --json` display it. First-login auto-rename: when no `--profile` flag was given and the only profile is named `default`, it is renamed to the email local-part. `profile_store.rename_profile()` primitive added. Zero-credit smoke test (`tests/smoke/test_profile_account_smoke.py`) ships with backfill path for pre-existing profiles. LLM council (9-dim) run; all must-fix items applied before merge. See `KNOWN_ISSUES.md` § Resolved for full detail.
|
|
363
365
|
- [x] **`/gflow:pr-council-review` slash command shipped 2026-05-26 (PR #97).** Multi-dimensional LLM council for open PRs (4 baseline + 8 adaptive dimensions, mandatory memory-slug binding, draft-PR guard, YELLOW escape valve, live-verify gate). Validated on PR #93; self-audited by 3-agent meta-council surfacing 13 must-fix items applied before merge. See memory `[[llm-council-code-review-pr93]]`.
|
|
364
366
|
- **Phase A (Backlog — Portability):** extract command body into `skills/pr-council-review/SKILL.md` so Gemini CLI / Codex / Cursor / Aider can consume it. Keep `.claude/commands/gflow/pr-council-review.md` as a thin wrapper. Memory: `[[pr-council-review-portability-backlog]]`.
|
|
@@ -662,6 +664,19 @@ Today the CLI writes media to `$GFLOW_CLI_OUTPUT_DIR` on the local filesystem. P
|
|
|
662
664
|
|
|
663
665
|
---
|
|
664
666
|
|
|
667
|
+
### Unified Multi-Account Management — BACKLOG
|
|
668
|
+
|
|
669
|
+
**Background:** A key strength of the gflow architecture is its capacity to drive and coordinate across multiple Google Accounts in a unified way. This enables horizontal scale, credit pooling, and parallel batch generation bypassing individual account quotas.
|
|
670
|
+
|
|
671
|
+
**Requirements & Implications:**
|
|
672
|
+
- **Cross-Account Session Inventory:** A unified credential manager tracking persistent browser context directories (`profile_<email_local>`) and session lifespans.
|
|
673
|
+
- **Concurrent Warm Context Pool:** A background daemon scheduling across a warm browser context pool representing multiple active Google Accounts (e.g., executing parallel worker queues on different profiles).
|
|
674
|
+
- **Round-Robin Queue Dispatcher:** A dispatcher that distributes task batches dynamically across profiles based on quota availability or idle status.
|
|
675
|
+
- **Aggregated Provenance Mapping:** The local `gflow.db` data layer indexes projects, operations, and downloaded files back to the generating Google identity.
|
|
676
|
+
- **Studio UI Integration:** Dropdowns displaying connected profiles, quota/credit tracking, active account tags on workflow nodes, and single-click profile swapping.
|
|
677
|
+
|
|
678
|
+
---
|
|
679
|
+
|
|
665
680
|
## 5. Decision log (ADRs in miniature)
|
|
666
681
|
|
|
667
682
|
| # | Decision | Rationale |
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# gflow-cli
|
|
2
|
+
|
|
3
|
+
> Unofficial Python CLI for Google Flow. Drive [Veo](https://labs.google/fx/tools/flow) (image-to-video, text-to-video) and Imagen (text-to-image) from your terminal: scripted, batched, pipeline-ready.
|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/gflow-cli/)
|
|
6
|
+
[](https://github.com/ffroliva/gflow-cli/actions/workflows/ci.yml)
|
|
7
|
+
[](https://github.com/ffroliva/gflow-cli/actions/workflows/release.yml)
|
|
8
|
+
[](https://pypi.org/project/gflow-cli/)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](docs/PROJECT_STATUS.md)
|
|
11
|
+
[](https://github.com/astral-sh/ruff)
|
|
12
|
+
[](https://github.com/microsoft/pyright)
|
|
13
|
+
[](CONTRIBUTING.md)
|
|
14
|
+
[](https://sonarcloud.io/summary/new_code?id=ffroliva_gflow-cli)
|
|
15
|
+
|
|
16
|
+
> ⚠️ **Unofficial, reverse-engineered, not affiliated with Google.** Endpoints can change without notice. Read the full [DISCLAIMER](DISCLAIMER.md).
|
|
17
|
+
>
|
|
18
|
+
> 🌐 **Headed browser today.** gflow drives Flow through a persistent Playwright Chromium profile, because Google's auth and reCAPTCHA gates require it. The [Architecture](#architecture--current-limitations) section shows where you can help.
|
|
19
|
+
|
|
20
|
+
## Why gflow-cli?
|
|
21
|
+
|
|
22
|
+
You pay for Google AI Ultra or Pro, you have Veo credits, and you run real batch work. gflow-cli gives you:
|
|
23
|
+
|
|
24
|
+
- **Batch generation.** Loop prompts straight from the shell: `for p in $(cat prompts.txt); do gflow image t2i "$p"; done`. Image batching plus `gflow video t2v` / `i2v` / `r2v` all ship today.
|
|
25
|
+
- **Consistent subjects.** `gflow character create` mints a Flow Character (face and body reference) so the same person appears from one generation to the next.
|
|
26
|
+
- **Pipelines.** Wire Veo into your content automation, AI-video stack, or batch experiments.
|
|
27
|
+
- **Terminal-native.** After one `gflow auth login`, you stay in the shell. No clicking through dialogs.
|
|
28
|
+
|
|
29
|
+
Same Veo and Imagen models, same quality, same Ultra/Pro billing, now programmatic.
|
|
30
|
+
|
|
31
|
+
## 60-second quick start
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# 1 · Install (uv recommended; also: pip install gflow-cli)
|
|
35
|
+
uv tool install gflow-cli
|
|
36
|
+
uv tool run --from gflow-cli playwright install chromium # one-time, ~150 MB
|
|
37
|
+
|
|
38
|
+
# 2 · Authenticate (one-time, opens a real Chrome window)
|
|
39
|
+
gflow auth login --browser chrome
|
|
40
|
+
|
|
41
|
+
# 3 · Generate
|
|
42
|
+
gflow image t2i "a hot air balloon over Tokyo at sunrise"
|
|
43
|
+
# or:
|
|
44
|
+
gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16:9
|
|
45
|
+
# or mint a reusable Character (face + body reference):
|
|
46
|
+
gflow character create --project <id> --name "Aria" --face-prompt "..." --body-prompt "..."
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Outputs land under `$GFLOW_CLI_OUTPUT_DIR`, or you can route them to S3, MinIO, or Google Cloud Storage with [`GFLOW_CLI_STORAGE_URI`](docs/EXTERNAL_STORAGE.md). The first call takes 30 to 90 seconds while Chromium warms up; later calls reuse the warm session.
|
|
50
|
+
|
|
51
|
+
> **Why `--browser chrome`?** Google rejects Playwright's bundled Chromium. The CLI fails fast with a friendly error (`AuthBrowserRejectedError`, exit code 14) if you pick anything else.
|
|
52
|
+
|
|
53
|
+
For the full 10-minute walkthrough with troubleshooting and multi-account setup, see **[USER_GUIDE: Journey 1](docs/USER_GUIDE.md#journey-1--first-time-setup-10-minutes)**.
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
One command in, real Flow output back. Left: `gflow image t2i` generating a photorealistic scene in your library. Right: a frame-to-frame transform.
|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
## Demo
|
|
62
|
+
|
|
63
|
+

|
|
64
|
+
|
|
65
|
+
A single `gflow image t2i "..." --aspect 9:16 --model nano2` call against a logged-in Pro/Ultra profile. The terminal streams the run's `structlog` JSON, then lists the written PNG. Chromium drives the Flow editor silently in the background.
|
|
66
|
+
|
|
67
|
+
Reproduce the recording with [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (Windows, OBS, ffmpeg, gifski). More formats, including the side-by-side split-screen: **[docs/DEMOS.md](docs/DEMOS.md)**.
|
|
68
|
+
|
|
69
|
+
## Documentation
|
|
70
|
+
|
|
71
|
+
[**docs/INDEX.md**](docs/INDEX.md) is the master routing layer. Quick links:
|
|
72
|
+
|
|
73
|
+
| Topic | Read |
|
|
74
|
+
|---|---|
|
|
75
|
+
| 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
|
|
76
|
+
| **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
|
|
77
|
+
| 🎭 **Characters** | [Characters](docs/CHARACTER.md), reusable subjects (`gflow character`) |
|
|
78
|
+
| 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
|
|
79
|
+
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
80
|
+
| 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
|
|
81
|
+
| 🤝 **Contributing** | [Contributing](CONTRIBUTING.md) · [Development](docs/DEVELOPMENT.md) · [GitHub workflow](docs/GITHUB.md) |
|
|
82
|
+
|
|
83
|
+
## For AI agents & LLMs
|
|
84
|
+
|
|
85
|
+
gflow-cli ships three agent entry points. Pick the one your tool reads first.
|
|
86
|
+
|
|
87
|
+
| File | Audience | Tools |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| [**AGENTS.md**](AGENTS.md) | Universal coding-agent spec | Cursor · Codex · Aider · Gemini CLI · Jules · Devin · Windsurf · Zed · Warp · opencode · Copilot |
|
|
90
|
+
| [**CLAUDE.md**](CLAUDE.md) | Claude Code's auto-loaded memory | Claude Code |
|
|
91
|
+
| [**llms.txt**](llms.txt) | LLM-readable summary (llmstxt.org format) | Paste into ChatGPT, Claude, or Gemini to onboard the model |
|
|
92
|
+
| [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md) | Claude Code Skill | Symlink into `~/.claude/skills/` |
|
|
93
|
+
|
|
94
|
+
Onboard any agent in one line. Paste this into your agent of choice:
|
|
95
|
+
|
|
96
|
+
> *"Read [AGENTS.md](https://github.com/ffroliva/gflow-cli/blob/main/AGENTS.md) and [docs/INDEX.md](https://github.com/ffroliva/gflow-cli/blob/main/docs/INDEX.md), then help me with my Flow batch."*
|
|
97
|
+
|
|
98
|
+
## Architecture & current limitations
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (tests) / [planned: Official Veo]
|
|
102
|
+
↓
|
|
103
|
+
Playwright Chromium (headed login, headless after)
|
|
104
|
+
↓
|
|
105
|
+
aisandbox-pa.googleapis.com (Google's private Flow API)
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Current transport:** `ui_automation` drives Flow through a persistent Playwright Chromium profile. It is production-stable and verified end-to-end every release (see the per-release `LIVE_VERIFICATION_*` evidence files).
|
|
109
|
+
|
|
110
|
+
**What's blocked:** a pure HTTP transport for video generation. The video upload endpoint returns HTTP 401 under non-Chrome browsers plus a reCAPTCHA mint we cannot reproduce headlessly. Three earlier HTTP strategies (`evaluate_fetch`, `bearer`, `sapisidhash`) live under `src/gflow_cli/api/transports/experimental/` for research, off the production path.
|
|
111
|
+
|
|
112
|
+
**How you can help:** if you have driven `aisandbox-pa.googleapis.com` from outside a real Chrome session, or you understand Google's anti-bot stack here, please open an issue. A working REST transport would unlock serverless deployments, true horizontal concurrency, and roughly 10x the project's reach. Details: [docs/ARCHITECTURE.md § Headed-browser dependency](docs/ARCHITECTURE.md#headed-browser-dependency--current-limitation).
|
|
113
|
+
|
|
114
|
+
## Project status
|
|
115
|
+
|
|
116
|
+
**Alpha.** Image (t2i, i2i, upload) and video (t2v, i2v, r2v) run end-to-end on `ui_automation`, with a 5-model Veo picker plus `--duration` and `--count`. Recent additions: `gflow character` for reusable subjects, `gflow scene` for credit-free server-side stitching, and `gflow video chain` for linked clips. Video `batch` is still queued for Phase B, so use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)).
|
|
117
|
+
|
|
118
|
+
Full milestone history lives in [CHANGELOG.md](CHANGELOG.md). Where the project is heading: [ROADMAP.md](ROADMAP.md).
|
|
119
|
+
|
|
120
|
+
## License & legal
|
|
121
|
+
|
|
122
|
+
[MIT License](LICENSE) © 2026 Flavio Oliva (`ffroliva`). The MIT license covers `gflow-cli`'s code only. It grants no rights to Flow, Veo model output, or any Google service. Google's own terms (Labs Additional Terms, Ultra/Pro subscription terms) govern your generations. See the [DISCLAIMER](DISCLAIMER.md).
|
|
123
|
+
|
|
124
|
+
## Acknowledgements
|
|
125
|
+
|
|
126
|
+
- [`edge-tts`](https://github.com/rany2/edge-tts), design inspiration for community SDKs over private cloud APIs.
|
|
127
|
+
- [`googleapis/python-genai`](https://github.com/googleapis/python-genai), the official Veo SDK that a future provider release may alias.
|
|
128
|
+
- [Keysight, *Google Labs – Flow AI with Veo3: A Network Traffic Analysis*](https://www.keysight.com/blogs/en/tech/nwvs/2025/08/04/google-flow-ai-har-analysis), an independent capture that helped validate the route patterns.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Stats
|
|
133
|
+
|
|
134
|
+
[](https://github.com/ffroliva/gflow-cli/stargazers)
|
|
135
|
+
[](https://github.com/ffroliva/gflow-cli/network/members)
|
|
136
|
+
[](https://github.com/ffroliva/gflow-cli/watchers)
|
|
137
|
+
[](https://github.com/ffroliva/gflow-cli/issues)
|
|
138
|
+
[](https://github.com/ffroliva/gflow-cli/pulls)
|
|
139
|
+
[](https://github.com/ffroliva/gflow-cli/commits/main)
|
|
140
|
+
[](https://github.com/ffroliva/gflow-cli)
|
|
141
|
+
[](https://pepy.tech/project/gflow-cli)
|
|
142
|
+
|
|
143
|
+
If `gflow-cli` saves you time, please ⭐ the repo. It is the cheapest way to support the project.
|
|
@@ -23,14 +23,15 @@ Extends the data layer surface from read-only listing to inspection and selectiv
|
|
|
23
23
|
- `gflow data export` — JSON / CSV / TSV
|
|
24
24
|
- `gflow data prune` — retention controls (`--older-than`, `--keep-last-n`)
|
|
25
25
|
|
|
26
|
-
## v0.11.0 — Local
|
|
26
|
+
## v0.11.0 — Local Studio, Background Worker & MCP SSE Service (in progress / develop)
|
|
27
27
|
|
|
28
|
-
The
|
|
28
|
+
The local Web UI Filmmaking Studio, background task worker, and MCP HTTP/SSE service are integrated into a single unified daemon interface under `gflow serve`.
|
|
29
29
|
|
|
30
|
-
- `gflow
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
30
|
+
- [x] **Uvicorn Daemon:** `gflow serve` starts the local FastAPI/Uvicorn server with background task loop.
|
|
31
|
+
- [x] **MCP SSE Server:** Exposes the MCP server over HTTP/SSE, allowing IDE clients and external tools to run JSON-RPC commands.
|
|
32
|
+
- [x] **Flow Worker Daemon:** Local queue manager and `FlowWorker` background task processor reading from SQLite queue tables and managing sequential profile-locked generation runs.
|
|
33
|
+
- [ ] **REST & Static UI:** FastAPI endpoints for asset management and hosting of the Filmmaking Studio (single-page app).
|
|
34
|
+
- [ ] **Aggregated Management:** Full view of accounts, profiles, projects, and active storyboarding queues.
|
|
34
35
|
|
|
35
36
|
## v1.0.0 — Stable API
|
|
36
37
|
|