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