gflow-cli 0.23.0__tar.gz → 0.24.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.23.0 → gflow_cli-0.24.0}/CHANGELOG.md +15 -1
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/PKG-INFO +1 -1
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/INDEX.md +1 -1
- gflow_cli-0.24.0/docs/LIVE_VERIFICATION_v0.24.0.md +38 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/MCP.md +2 -2
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/PROJECT_STATUS.md +14 -1
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/USAGE.md +29 -6
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/pyproject.toml +1 -1
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/_cli_helpers.py +21 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_image.py +6 -19
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_video.py +66 -25
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/tools.py +148 -97
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_launch_kwargs.py +45 -0
- gflow_cli-0.24.0/tests/auth/test_cookies.py +107 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video.py +187 -29
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_helpers.py +10 -1
- gflow_cli-0.24.0/tests/mcp/test_tools_helpers.py +149 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/test_tools_wired.py +94 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/worker/test_daemon.py +30 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/uv.lock +1 -1
- gflow_cli-0.23.0/tests/auth/test_cookies.py +0 -51
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.env.template +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.gitattributes +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.gitignore +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/.secrets.baseline +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/AGENTS.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CLAUDE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/GEMINI.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/LICENSE +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/RELEASE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/ROADMAP.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docker-compose.yml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/llms.txt +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/README.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/sonar-project.properties +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/client.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_config.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_media.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.23.0 → gflow_cli-0.24.0}/tests/ui/test_app.py +0 -0
|
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.24.0] — 2026-07-01
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`--project` on `video t2v`/`i2v`/`r2v` (#233)**: generate into an existing Flow
|
|
15
|
+
project instead of always creating a scratch project, matching `image t2i`/`i2i`.
|
|
16
|
+
Lets programmatic callers (e.g. a multi-clip storyboard worker) share one project
|
|
17
|
+
across several video generations instead of leaving one throwaway project per clip.
|
|
18
|
+
- **`project` parameter on the MCP `gflow_generate_image` / `gflow_generate_video`
|
|
19
|
+
tools**: mirrors the CLI `--project` flag so MCP callers can also target an existing
|
|
20
|
+
Flow project (validated against the same id format). Completes `--project` parity
|
|
21
|
+
across the CLI and MCP surfaces.
|
|
22
|
+
|
|
10
23
|
## [0.23.0] — 2026-07-01
|
|
11
24
|
|
|
12
25
|
### Added
|
|
@@ -1682,7 +1695,8 @@ shell-script template that branches on these codes.
|
|
|
1682
1695
|
|
|
1683
1696
|
First skeleton. Not functional end-to-end yet.
|
|
1684
1697
|
|
|
1685
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1698
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.24.0...HEAD
|
|
1699
|
+
[0.24.0]: https://github.com/ffroliva/gflow-cli/compare/v0.23.0...v0.24.0
|
|
1686
1700
|
[0.23.0]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...v0.23.0
|
|
1687
1701
|
[0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
|
|
1688
1702
|
[0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.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
|
|
@@ -117,7 +117,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
117
117
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
118
118
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
119
119
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
120
|
-
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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)
|
|
120
|
+
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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)
|
|
121
121
|
**"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.
|
|
122
122
|
**"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)
|
|
123
123
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Live Verification — v0.24.0
|
|
2
|
+
|
|
3
|
+
Release date: 2026-07-01. This release completes `--project` parity: `video
|
|
4
|
+
t2v/i2v/r2v` gain `--project` (#233/#234) and the MCP `gflow_generate_image` /
|
|
5
|
+
`gflow_generate_video` tools gain a `project` parameter (#235) — both let a caller
|
|
6
|
+
target an existing Flow project instead of a scratch one.
|
|
7
|
+
|
|
8
|
+
## Scope
|
|
9
|
+
|
|
10
|
+
| Change | Surface | Verification |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| **#234** — `--project` on `video t2v/i2v/r2v` (CLI) | `cli_video.py`, `_cli_helpers.py` | ✅ Automated — behavior tests assert the id threads to `generate_video(project_id=...)` for all three modes; default (no flag) → scratch project; bad id rejected at the CLI boundary. Full council review GREEN + Sonar 100% new-coverage. |
|
|
13
|
+
| **#235** — `project` param on MCP generate tools | `mcp/tools.py` | ✅ Automated — payload-threading tests assert `project` reaches `payload["project_id"]` (image + video), omitted → no `project_id`, bad id rejected before the worker. Reuses the CLI `_FLOW_ID_RE` validator. Council GREEN + Sonar pass. |
|
|
14
|
+
|
|
15
|
+
## Nature of the change (why automated coverage is sufficient here)
|
|
16
|
+
|
|
17
|
+
Neither change adds new generation plumbing: the worker/daemon already consumed
|
|
18
|
+
`payload["project_id"]` (daemon.py:97 image, :168 video) and `FlowApiClient.generate_video`
|
|
19
|
+
already accepted `project_id`. Both PRs only **surface + validate** the existing
|
|
20
|
+
capability at the CLI and MCP boundaries, and thread it into the already-wired payload.
|
|
21
|
+
The end-to-end "generate into an existing project" path (browser navigation to
|
|
22
|
+
`project_editor_url(locale, project_id)` → `entering_existing_project`) is the same code
|
|
23
|
+
prior releases exercised live for `image t2i --project`.
|
|
24
|
+
|
|
25
|
+
## Live generation status
|
|
26
|
+
|
|
27
|
+
A live credit-free run of `--project` against real Flow was **not** performed this cycle
|
|
28
|
+
because the available `denon82` profile's Flow session is server-side expired (HTTP 401 —
|
|
29
|
+
see [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md)); exercising it requires an
|
|
30
|
+
interactive `gflow auth login`. The project-targeting code path is shared with the
|
|
31
|
+
already-live-verified `image t2i --project` path, and is fully covered by the automated
|
|
32
|
+
behavior tests above.
|
|
33
|
+
|
|
34
|
+
## Automated coverage
|
|
35
|
+
|
|
36
|
+
- Full suite green on both PRs' CI (test matrix 3.11/3.12/3.13) at the merged tree.
|
|
37
|
+
- `pyright src`: 0 errors. `ruff check` / `ruff format --check`: clean.
|
|
38
|
+
- SonarCloud gate green on both PRs (#234 new-coverage 100%; #235 pass).
|
|
@@ -45,8 +45,8 @@ Both Click CLI (`src/gflow_cli/cli.py`) and MCP Server (`src/gflow_cli/mcp/`) ar
|
|
|
45
45
|
The server registers three protocol surfaces:
|
|
46
46
|
|
|
47
47
|
### Tools (Executable actions)
|
|
48
|
-
* `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `reference_images` switches to i2i.
|
|
49
|
-
* `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, tools, profile)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `i2v` requires `initial_frame`, `r2v` requires `reference_images
|
|
48
|
+
* `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile, project)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `reference_images` switches to i2i; `project` generates into an existing Flow project id (mirrors CLI `--project`).
|
|
49
|
+
* `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, tools, profile, project)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `i2v` requires `initial_frame`, `r2v` requires `reference_images`; `project` generates into an existing Flow project id (mirrors CLI `--project`).
|
|
50
50
|
* `gflow_list_projects(profile, limit)`: Queries SQLite catalog for recent generation folders.
|
|
51
51
|
* `gflow_list_characters(profile)`: Lists Flow Character entities (requires an active browser session).
|
|
52
52
|
|
|
@@ -4,6 +4,19 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
+
**v0.24.0 — alpha.** **`--project` parity across CLI + MCP.** The video commands
|
|
8
|
+
(`video t2v`/`i2v`/`r2v`) gain `--project <id>` to generate into an existing Flow project
|
|
9
|
+
instead of a scratch one (#233/#234), matching `image t2i`/`i2i`; and the MCP
|
|
10
|
+
`gflow_generate_image` / `gflow_generate_video` tools gain a matching `project` parameter
|
|
11
|
+
(#235), so agent callers get the same capability. Both surface an already-wired worker
|
|
12
|
+
capability (`payload["project_id"]`) and validate the id identically. Carries forward
|
|
13
|
+
v0.23.0 (MCP generation live + macOS 401 fix). Verification:
|
|
14
|
+
[LIVE_VERIFICATION_v0.24.0](LIVE_VERIFICATION_v0.24.0.md).
|
|
15
|
+
|
|
16
|
+
**Develop (unreleased, post-v0.24.0):** *(empty — develop is the staging branch for the next release).*
|
|
17
|
+
|
|
18
|
+
<details><summary>v0.23.0 — MCP generation live + macOS 401 fixed</summary>
|
|
19
|
+
|
|
7
20
|
**v0.23.0 — alpha.** **MCP generation goes live + macOS 401 fixed.** The MCP server's
|
|
8
21
|
`gflow_generate_image` / `gflow_generate_video` tools — previously non-functional stubs —
|
|
9
22
|
are now wired end-to-end to the FlowWorker queue (background worker owns download +
|
|
@@ -16,7 +29,7 @@ Carries forward v0.22.0 (Tools framework) + v0.21.0 (MCP server). Verification:
|
|
|
16
29
|
[LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP wiring proven live; #222
|
|
17
30
|
reporter-verified e2e on macOS).
|
|
18
31
|
|
|
19
|
-
|
|
32
|
+
</details>
|
|
20
33
|
|
|
21
34
|
<details><summary>v0.22.0 — Tools framework ("Creative Director")</summary>
|
|
22
35
|
|
|
@@ -438,7 +438,11 @@ All prompts in a batch share one Flow project. The editor is opened once; each p
|
|
|
438
438
|
Generate a video from a text prompt only.
|
|
439
439
|
|
|
440
440
|
```text
|
|
441
|
-
gflow video t2v PROMPT [--model] [--duration] [--count] [--aspect] [--profile] [-t/--tool] [--out-dir]
|
|
441
|
+
gflow video t2v PROMPT [--model] [--duration] [--count] [--aspect] [--profile] [-t/--tool] [--project] [--out-dir]
|
|
442
|
+
|
|
443
|
+
Options:
|
|
444
|
+
--project ID Generate in this EXISTING Flow project instead of a
|
|
445
|
+
scratch project (see "Sharing one project across calls").
|
|
442
446
|
```
|
|
443
447
|
|
|
444
448
|
```bash
|
|
@@ -472,6 +476,8 @@ Arguments:
|
|
|
472
476
|
Options:
|
|
473
477
|
--initial-frame PATH Initial frame to animate. Canonical form; replaces the positional IMAGE.
|
|
474
478
|
--end-frame PATH Optional end frame — Flow interpolates initial frame -> end frame.
|
|
479
|
+
--project ID Generate in this EXISTING Flow project instead of a
|
|
480
|
+
scratch project (see "Sharing one project across calls").
|
|
475
481
|
```
|
|
476
482
|
|
|
477
483
|
```bash
|
|
@@ -491,7 +497,9 @@ images. Per-model cap: `omni-flash` ≤7, the `veo-*` models ≤3. Fires
|
|
|
491
497
|
gflow video r2v PROMPT --ref IMG [--ref IMG ...] [--model] [--duration] [--count] [--aspect] [...]
|
|
492
498
|
|
|
493
499
|
Options:
|
|
494
|
-
--ref PATH
|
|
500
|
+
--ref PATH Reference image; repeat for up to 7 (omni-flash) / 3 (veo). [required]
|
|
501
|
+
--project ID Generate in this EXISTING Flow project instead of a scratch
|
|
502
|
+
project (see "Sharing one project across calls").
|
|
495
503
|
```
|
|
496
504
|
|
|
497
505
|
```bash
|
|
@@ -499,6 +507,19 @@ gflow video r2v "a knight in this armor walks forward" --ref armor.png
|
|
|
499
507
|
gflow video r2v "blend these worlds" --ref a.png --ref b.png --ref c.png --model omni-flash
|
|
500
508
|
```
|
|
501
509
|
|
|
510
|
+
### Sharing one project across calls
|
|
511
|
+
|
|
512
|
+
By default each `video t2v` / `i2v` / `r2v` call creates its own scratch Flow
|
|
513
|
+
project. Pass `--project <id>` (same contract as `image t2i`/`i2i` — see
|
|
514
|
+
[`gflow image t2i`](#gflow-image-t2i)) to generate into an existing project
|
|
515
|
+
instead, e.g. to avoid one-throwaway-project-per-clip when scripting a
|
|
516
|
+
multi-clip storyboard:
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
gflow video t2v "establishing shot" --project PROJ123
|
|
520
|
+
gflow video t2v "close-up reaction" --project PROJ123
|
|
521
|
+
```
|
|
522
|
+
|
|
502
523
|
## `gflow video batch`
|
|
503
524
|
|
|
504
525
|
> ⚠️ **Not yet implemented.** The `batch` subcommand currently exits with
|
|
@@ -509,10 +530,12 @@ gflow video r2v "blend these worlds" --ref a.png --ref b.png --ref c.png --model
|
|
|
509
530
|
### Workaround — shell for-loop
|
|
510
531
|
|
|
511
532
|
Until the manifest runner lands, you can drive sequential video generations
|
|
512
|
-
through a plain shell loop.
|
|
513
|
-
its **own Flow project**, so the resulting videos
|
|
514
|
-
`project_id` (unlike `gflow image batch`, which mounts one
|
|
515
|
-
all prompts) — but they DO get generated and downloaded
|
|
533
|
+
through a plain shell loop. Without `--project`, each `gflow video t2v` /
|
|
534
|
+
`i2v` / `r2v` call opens its **own Flow project**, so the resulting videos
|
|
535
|
+
will NOT share a `project_id` (unlike `gflow image batch`, which mounts one
|
|
536
|
+
project across all prompts) — but they DO get generated and downloaded. Pass
|
|
537
|
+
the same `--project <id>` to every call in the loop (see "Sharing one project
|
|
538
|
+
across calls" above) if you want them to land in one project instead:
|
|
516
539
|
|
|
517
540
|
```bash
|
|
518
541
|
# bash / WSL / macOS — one prompt per line
|
|
@@ -35,6 +35,7 @@ been removed. Both error handlers now import
|
|
|
35
35
|
|
|
36
36
|
from __future__ import annotations
|
|
37
37
|
|
|
38
|
+
import re
|
|
38
39
|
import sys
|
|
39
40
|
from pathlib import Path
|
|
40
41
|
from typing import TYPE_CHECKING, Any, Literal
|
|
@@ -70,16 +71,36 @@ _console = Console()
|
|
|
70
71
|
# `reportPrivateUsage` rule does NOT honor the PEP 484 `from X import Y as Y`
|
|
71
72
|
# re-export idiom for underscore names, so __all__ is the practical fix.
|
|
72
73
|
__all__ = [
|
|
74
|
+
"_FLOW_ID_RE",
|
|
73
75
|
"_handle_gflow_error",
|
|
74
76
|
"_handle_unhandled_error",
|
|
75
77
|
"_make_provider_dir",
|
|
76
78
|
"_resolve_profile",
|
|
79
|
+
"_validate_project_id",
|
|
77
80
|
"apply_tool_option",
|
|
78
81
|
"run_with_handlers",
|
|
79
82
|
"safe_path_text",
|
|
80
83
|
"tool_option",
|
|
81
84
|
]
|
|
82
85
|
|
|
86
|
+
# Flow project ids are interpolated into navigation URLs and CSS selectors
|
|
87
|
+
# (page.goto, `data-tile-id='fe_id_<id>'`) before any other guard runs, so the
|
|
88
|
+
# `--project` option on both `image t2i`/`i2i` and `video t2v`/`i2v`/`r2v`
|
|
89
|
+
# validates against this allowlist at the CLI boundary. Mirrors
|
|
90
|
+
# `routes._PROJECT_ID_RE`. Relocated here (T4b follow-up) so the two call-site
|
|
91
|
+
# modules can't drift out of sync.
|
|
92
|
+
_FLOW_ID_RE = re.compile(r"^[A-Za-z0-9\-]{1,128}$")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _validate_project_id(
|
|
96
|
+
_ctx: click.Context, param: click.Parameter, value: str | None
|
|
97
|
+
) -> str | None:
|
|
98
|
+
"""Reject a --project id that isn't alphanumeric/hyphen (1-128 chars)."""
|
|
99
|
+
if value is not None and not _FLOW_ID_RE.fullmatch(value):
|
|
100
|
+
msg = "project id must be 1-128 chars of letters, digits, or hyphens."
|
|
101
|
+
raise click.BadParameter(msg, param=param)
|
|
102
|
+
return value
|
|
103
|
+
|
|
83
104
|
|
|
84
105
|
_TOOL_OPTION_HELP = (
|
|
85
106
|
"Apply a prompt tool before generating, e.g. --tool creative-director or "
|
|
@@ -29,8 +29,10 @@ from rich.table import Table
|
|
|
29
29
|
|
|
30
30
|
from gflow_cli import json_output
|
|
31
31
|
from gflow_cli._cli_helpers import (
|
|
32
|
+
_FLOW_ID_RE,
|
|
32
33
|
_make_provider_dir,
|
|
33
34
|
_resolve_profile,
|
|
35
|
+
_validate_project_id,
|
|
34
36
|
apply_tool_option,
|
|
35
37
|
run_with_handlers,
|
|
36
38
|
safe_path_text,
|
|
@@ -106,25 +108,10 @@ _CREATING_PROJECT_MSG = " Creating project..."
|
|
|
106
108
|
_T2I_PROJECT_TITLE = "gflow-cli t2i"
|
|
107
109
|
_I2I_PROJECT_TITLE = "gflow-cli i2i"
|
|
108
110
|
|
|
109
|
-
# Flow project
|
|
110
|
-
#
|
|
111
|
-
#
|
|
112
|
-
#
|
|
113
|
-
_FLOW_ID_RE = re.compile(r"^[A-Za-z0-9\-]{1,128}$")
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
def _validate_project_id(
|
|
117
|
-
_ctx: click.Context, param: click.Parameter, value: str | None
|
|
118
|
-
) -> str | None:
|
|
119
|
-
"""Reject a --project id that isn't alphanumeric/hyphen (1-128 chars).
|
|
120
|
-
|
|
121
|
-
The value is interpolated into the editor navigation URL (`page.goto`) before
|
|
122
|
-
any other guard runs, so validate here at the boundary.
|
|
123
|
-
"""
|
|
124
|
-
if value is not None and not _FLOW_ID_RE.fullmatch(value):
|
|
125
|
-
msg = "project id must be 1-128 chars of letters, digits, or hyphens."
|
|
126
|
-
raise click.BadParameter(msg, param=param)
|
|
127
|
-
return value
|
|
111
|
+
# `_FLOW_ID_RE` / `_validate_project_id` (Flow project/character-entity id
|
|
112
|
+
# allowlist for --project / --reference-entity) live in gflow_cli._cli_helpers
|
|
113
|
+
# since they're shared with cli_video.py's --project option — see that
|
|
114
|
+
# module's docstring for the injection-surface rationale.
|
|
128
115
|
|
|
129
116
|
|
|
130
117
|
def _validate_entity_ids(
|
|
@@ -19,6 +19,7 @@ from gflow_cli import json_output
|
|
|
19
19
|
from gflow_cli._cli_helpers import (
|
|
20
20
|
_make_provider_dir,
|
|
21
21
|
_resolve_profile,
|
|
22
|
+
_validate_project_id,
|
|
22
23
|
apply_tool_option,
|
|
23
24
|
run_with_handlers,
|
|
24
25
|
tool_option,
|
|
@@ -37,6 +38,14 @@ if TYPE_CHECKING:
|
|
|
37
38
|
console = Console()
|
|
38
39
|
logger = structlog.get_logger(__name__)
|
|
39
40
|
|
|
41
|
+
_project_option = click.option(
|
|
42
|
+
"--project",
|
|
43
|
+
"project_id",
|
|
44
|
+
default=None,
|
|
45
|
+
callback=_validate_project_id,
|
|
46
|
+
help=("Generate in this existing Flow project id instead of creating a scratch project."),
|
|
47
|
+
)
|
|
48
|
+
|
|
40
49
|
|
|
41
50
|
def _warn_persistence_failed_after_success(
|
|
42
51
|
*,
|
|
@@ -66,6 +75,7 @@ async def _generate_and_report(
|
|
|
66
75
|
out_dir: Path | None,
|
|
67
76
|
command: str = "video",
|
|
68
77
|
as_json: bool = False,
|
|
78
|
+
project_id: str | None = None,
|
|
69
79
|
) -> None:
|
|
70
80
|
"""Drive FlowApiClient for a single GenerateVideoRequest and print the
|
|
71
81
|
result (or fail with a non-zero exit). Shared by t2v, i2v, and r2v.
|
|
@@ -103,6 +113,7 @@ async def _generate_and_report(
|
|
|
103
113
|
|
|
104
114
|
result = await client.generate_video(
|
|
105
115
|
req=request,
|
|
116
|
+
project_id=project_id,
|
|
106
117
|
out_dir=out_dir,
|
|
107
118
|
download=True,
|
|
108
119
|
on_started=on_started,
|
|
@@ -160,6 +171,7 @@ async def _run_t2v(
|
|
|
160
171
|
as_json: bool = False,
|
|
161
172
|
original_prompt: str | None = None,
|
|
162
173
|
tool: AppliedTool | None = None,
|
|
174
|
+
project_id: str | None = None,
|
|
163
175
|
) -> None:
|
|
164
176
|
from gflow_cli.api.video import Aspect, GenerateVideoRequest, Mode, VideoModel
|
|
165
177
|
|
|
@@ -180,24 +192,38 @@ async def _run_t2v(
|
|
|
180
192
|
out_dir=out_dir,
|
|
181
193
|
command="video t2v",
|
|
182
194
|
as_json=as_json,
|
|
195
|
+
project_id=project_id,
|
|
183
196
|
)
|
|
184
197
|
|
|
185
198
|
|
|
199
|
+
@dataclass(frozen=True)
|
|
200
|
+
class _I2VParams:
|
|
201
|
+
"""Bundles image-to-video generation options for :func:`_run_i2v`.
|
|
202
|
+
|
|
203
|
+
Separating these from the profile/output/count fields keeps the function
|
|
204
|
+
signature below Sonar's 13-parameter limit (S107) while preserving every
|
|
205
|
+
CLI option. Mirrors `cli_image.py`'s `_I2IParams`.
|
|
206
|
+
"""
|
|
207
|
+
|
|
208
|
+
image: str
|
|
209
|
+
prompt: str
|
|
210
|
+
aspect: str
|
|
211
|
+
end_frame: str | None = None
|
|
212
|
+
model: str | None = None
|
|
213
|
+
duration: int | None = None
|
|
214
|
+
original_prompt: str | None = None
|
|
215
|
+
tool: AppliedTool | None = None
|
|
216
|
+
|
|
217
|
+
|
|
186
218
|
async def _run_i2v(
|
|
187
219
|
*,
|
|
188
220
|
profile_name: str,
|
|
189
221
|
profile_dir: Path,
|
|
190
|
-
|
|
191
|
-
prompt: str,
|
|
192
|
-
aspect: str,
|
|
222
|
+
params: _I2VParams,
|
|
193
223
|
out_dir: Path | None,
|
|
194
|
-
end_frame: str | None = None,
|
|
195
|
-
model: str | None = None,
|
|
196
|
-
duration: int | None = None,
|
|
197
224
|
count: int = 1,
|
|
198
225
|
as_json: bool = False,
|
|
199
|
-
|
|
200
|
-
tool: AppliedTool | None = None,
|
|
226
|
+
project_id: str | None = None,
|
|
201
227
|
) -> None:
|
|
202
228
|
from gflow_cli.api.video import (
|
|
203
229
|
I2V_DEFAULT_MODEL,
|
|
@@ -213,7 +239,7 @@ async def _run_i2v(
|
|
|
213
239
|
# direct programmatic call can still smuggle it in. omni-flash silently
|
|
214
240
|
# drops the start/end frames at submit and routes to T2V (issue #125), so
|
|
215
241
|
# reject it here before any paid call.
|
|
216
|
-
resolved_model = VideoModel.from_cli(model)
|
|
242
|
+
resolved_model = VideoModel.from_cli(params.model)
|
|
217
243
|
if resolved_model is None:
|
|
218
244
|
resolved_model = I2V_DEFAULT_MODEL
|
|
219
245
|
elif not resolved_model.supports_i2v_interpolation():
|
|
@@ -225,16 +251,16 @@ async def _run_i2v(
|
|
|
225
251
|
raise ModelModeIncompatibilityError(detail=msg)
|
|
226
252
|
|
|
227
253
|
request = GenerateVideoRequest(
|
|
228
|
-
prompt=prompt,
|
|
254
|
+
prompt=params.prompt,
|
|
229
255
|
mode=Mode.I2V,
|
|
230
|
-
aspect=Aspect.from_cli(aspect),
|
|
256
|
+
aspect=Aspect.from_cli(params.aspect),
|
|
231
257
|
model=resolved_model,
|
|
232
|
-
duration=duration,
|
|
258
|
+
duration=params.duration,
|
|
233
259
|
count=count,
|
|
234
|
-
start_image=Path(image),
|
|
235
|
-
end_image=Path(end_frame) if end_frame else None,
|
|
236
|
-
original_prompt=original_prompt,
|
|
237
|
-
tool=tool,
|
|
260
|
+
start_image=Path(params.image),
|
|
261
|
+
end_image=Path(params.end_frame) if params.end_frame else None,
|
|
262
|
+
original_prompt=params.original_prompt,
|
|
263
|
+
tool=params.tool,
|
|
238
264
|
)
|
|
239
265
|
await _generate_and_report(
|
|
240
266
|
request,
|
|
@@ -243,6 +269,7 @@ async def _run_i2v(
|
|
|
243
269
|
out_dir=out_dir,
|
|
244
270
|
command="video i2v",
|
|
245
271
|
as_json=as_json,
|
|
272
|
+
project_id=project_id,
|
|
246
273
|
)
|
|
247
274
|
|
|
248
275
|
|
|
@@ -260,6 +287,7 @@ async def _run_r2v(
|
|
|
260
287
|
as_json: bool = False,
|
|
261
288
|
original_prompt: str | None = None,
|
|
262
289
|
tool: AppliedTool | None = None,
|
|
290
|
+
project_id: str | None = None,
|
|
263
291
|
) -> None:
|
|
264
292
|
from gflow_cli.api.video import Aspect, GenerateVideoRequest, Mode, VideoModel
|
|
265
293
|
|
|
@@ -281,6 +309,7 @@ async def _run_r2v(
|
|
|
281
309
|
out_dir=out_dir,
|
|
282
310
|
command="video r2v",
|
|
283
311
|
as_json=as_json,
|
|
312
|
+
project_id=project_id,
|
|
284
313
|
)
|
|
285
314
|
|
|
286
315
|
|
|
@@ -769,6 +798,7 @@ def video() -> None:
|
|
|
769
798
|
"falls back to the original prompt if unset or on error."
|
|
770
799
|
),
|
|
771
800
|
)
|
|
801
|
+
@_project_option
|
|
772
802
|
@click.option(
|
|
773
803
|
"--out-dir",
|
|
774
804
|
"out_dir",
|
|
@@ -790,6 +820,7 @@ def t2v(
|
|
|
790
820
|
count: int,
|
|
791
821
|
profile: str | None,
|
|
792
822
|
tool_specs: tuple[str, ...],
|
|
823
|
+
project_id: str | None,
|
|
793
824
|
out_dir: Path | None,
|
|
794
825
|
as_json: bool,
|
|
795
826
|
) -> None:
|
|
@@ -812,6 +843,7 @@ def t2v(
|
|
|
812
843
|
as_json=as_json,
|
|
813
844
|
original_prompt=original_prompt,
|
|
814
845
|
tool=applied_tool,
|
|
846
|
+
project_id=project_id,
|
|
815
847
|
),
|
|
816
848
|
cli_command="video t2v",
|
|
817
849
|
as_json=as_json,
|
|
@@ -930,6 +962,7 @@ def _resolve_i2v_args(
|
|
|
930
962
|
)
|
|
931
963
|
@click.option("--profile", default=None, help="Profile name (overrides default).")
|
|
932
964
|
@tool_option
|
|
965
|
+
@_project_option
|
|
933
966
|
@click.option(
|
|
934
967
|
"--out-dir",
|
|
935
968
|
"out_dir",
|
|
@@ -943,7 +976,7 @@ def _resolve_i2v_args(
|
|
|
943
976
|
is_flag=True,
|
|
944
977
|
help="Emit a machine-readable JSON result instead of Rich output.",
|
|
945
978
|
)
|
|
946
|
-
def i2v(
|
|
979
|
+
def i2v( # NOSONAR
|
|
947
980
|
image: str | None,
|
|
948
981
|
prompt: str | None,
|
|
949
982
|
initial_frame: str | None,
|
|
@@ -955,6 +988,7 @@ def i2v(
|
|
|
955
988
|
count: int,
|
|
956
989
|
profile: str | None,
|
|
957
990
|
tool_specs: tuple[str, ...],
|
|
991
|
+
project_id: str | None,
|
|
958
992
|
out_dir: Path | None,
|
|
959
993
|
as_json: bool,
|
|
960
994
|
) -> None:
|
|
@@ -976,21 +1010,25 @@ def i2v(
|
|
|
976
1010
|
prompt_to_send, original_prompt, applied_tool = apply_tool_option(
|
|
977
1011
|
resolved_prompt, tool_specs, category="video", quiet=as_json
|
|
978
1012
|
)
|
|
1013
|
+
i2v_params = _I2VParams(
|
|
1014
|
+
image=resolved_image,
|
|
1015
|
+
prompt=prompt_to_send,
|
|
1016
|
+
aspect=aspect,
|
|
1017
|
+
end_frame=end_frame,
|
|
1018
|
+
model=model,
|
|
1019
|
+
duration=int(duration) if duration is not None else None,
|
|
1020
|
+
original_prompt=original_prompt,
|
|
1021
|
+
tool=applied_tool,
|
|
1022
|
+
)
|
|
979
1023
|
run_with_handlers(
|
|
980
1024
|
lambda: _run_i2v(
|
|
981
1025
|
profile_name=profile_name,
|
|
982
1026
|
profile_dir=provider_dir,
|
|
983
|
-
|
|
984
|
-
prompt=prompt_to_send,
|
|
985
|
-
end_frame=end_frame,
|
|
986
|
-
aspect=aspect,
|
|
987
|
-
model=model,
|
|
988
|
-
duration=int(duration) if duration is not None else None,
|
|
1027
|
+
params=i2v_params,
|
|
989
1028
|
count=count,
|
|
990
1029
|
out_dir=out_dir,
|
|
991
1030
|
as_json=as_json,
|
|
992
|
-
|
|
993
|
-
tool=applied_tool,
|
|
1031
|
+
project_id=project_id,
|
|
994
1032
|
),
|
|
995
1033
|
cli_command="video i2v",
|
|
996
1034
|
as_json=as_json,
|
|
@@ -1051,6 +1089,7 @@ def i2v(
|
|
|
1051
1089
|
)
|
|
1052
1090
|
@click.option("--profile", default=None, help="Profile name (overrides default).")
|
|
1053
1091
|
@tool_option
|
|
1092
|
+
@_project_option
|
|
1054
1093
|
@click.option(
|
|
1055
1094
|
"--out-dir",
|
|
1056
1095
|
"out_dir",
|
|
@@ -1073,6 +1112,7 @@ def r2v(
|
|
|
1073
1112
|
count: int,
|
|
1074
1113
|
profile: str | None,
|
|
1075
1114
|
tool_specs: tuple[str, ...],
|
|
1115
|
+
project_id: str | None,
|
|
1076
1116
|
out_dir: Path | None,
|
|
1077
1117
|
as_json: bool,
|
|
1078
1118
|
) -> None:
|
|
@@ -1114,6 +1154,7 @@ def r2v(
|
|
|
1114
1154
|
as_json=as_json,
|
|
1115
1155
|
original_prompt=original_prompt,
|
|
1116
1156
|
tool=applied_tool,
|
|
1157
|
+
project_id=project_id,
|
|
1117
1158
|
),
|
|
1118
1159
|
cli_command="video r2v",
|
|
1119
1160
|
as_json=as_json,
|