gflow-cli 0.22.0__tar.gz → 0.24.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gflow_cli-0.24.0/.claude/commands/gflow/issue-assessment.md +28 -0
- gflow_cli-0.24.0/.claude/commands/gflow/issue-resolve.md +18 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/ci.yml +5 -2
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/AGENTS.md +9 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CHANGELOG.md +70 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/GEMINI.md +1 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/KNOWN_ISSUES.md +22 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/PKG-INFO +2 -2
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/PLAN.md +1 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/INDEX.md +1 -2
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.22.0.md +36 -2
- gflow_cli-0.24.0/docs/LIVE_VERIFICATION_v0.23.0.md +76 -0
- gflow_cli-0.24.0/docs/LIVE_VERIFICATION_v0.24.0.md +38 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/MCP.md +4 -4
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/PROJECT_STATUS.md +32 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/USAGE.md +29 -6
- gflow_cli-0.24.0/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +143 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/pyproject.toml +3 -3
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_patchright.py +9 -2
- gflow_cli-0.24.0/skills/issue-assessment/SKILL.md +142 -0
- gflow_cli-0.24.0/skills/issue-resolve/SKILL.md +123 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/_cli_helpers.py +21 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/client.py +224 -4
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation.py +10 -9
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/cookies.py +36 -3
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/browser_manager.py +112 -12
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli.py +21 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_image.py +6 -19
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_video.py +66 -25
- gflow_cli-0.24.0/src/gflow_cli/mcp/tools.py +832 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/daemon.py +132 -34
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_image.py +47 -0
- gflow_cli-0.24.0/tests/api/test_client_launch_kwargs.py +355 -0
- gflow_cli-0.24.0/tests/auth/test_cookies.py +107 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video.py +187 -29
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_helpers.py +10 -1
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/dev/test_recording_client.py +1 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/test_server.py +106 -18
- gflow_cli-0.24.0/tests/mcp/test_tools_helpers.py +149 -0
- gflow_cli-0.24.0/tests/mcp/test_tools_wired.py +534 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_browser_manager.py +89 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/worker/test_daemon.py +138 -19
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/uv.lock +25 -25
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +0 -117
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +0 -110
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +0 -66
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +0 -233
- gflow_cli-0.22.0/src/gflow_cli/mcp/tools.py +0 -340
- gflow_cli-0.22.0/tests/api/test_client_launch_kwargs.py +0 -77
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.env.template +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.gitattributes +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.gitignore +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/.secrets.baseline +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CLAUDE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/LICENSE +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/RELEASE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/ROADMAP.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docker-compose.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/llms.txt +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/sonar-project.properties +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_config.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_media.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.24.0}/tests/ui/test_app.py +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >
|
|
3
|
+
Triage a gflow-cli GitHub issue: verify the reporter's claim against code,
|
|
4
|
+
tests, docs, KNOWN_ISSUES, and memory; classify it (CONFIRMED / NEEDS-E2E /
|
|
5
|
+
NEEDS-INFO / DUPLICATE / INVALID / WONTFIX); judge whether it is verifiable
|
|
6
|
+
end-to-end in the current environment; and draft a reporter-facing reply.
|
|
7
|
+
Read-only — changes nothing and posts nothing on its own.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# `/gflow:issue-assessment [issue number or URL]`
|
|
11
|
+
|
|
12
|
+
**Read `skills/issue-assessment/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the issue to assess.
|
|
13
|
+
|
|
14
|
+
> Do **not** call `Skill(skill="issue-assessment")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not Skill-tool-invocable (only `.claude/commands/gflow/*` are). Read the file directly instead.
|
|
15
|
+
|
|
16
|
+
The skill at `skills/issue-assessment/SKILL.md` ingests the issue, verifies the
|
|
17
|
+
claim (dispatching a search agent to keep context clean), assigns one verdict,
|
|
18
|
+
applies the **e2e-gate** (never claim a fix is verified on an unverifiable
|
|
19
|
+
surface), and emits a standard report artifact. On a `CONFIRMED` / `LIKELY-BUG`
|
|
20
|
+
verdict with localized, verifiable scope it hands off to `issue-resolve`;
|
|
21
|
+
otherwise it replies only.
|
|
22
|
+
|
|
23
|
+
**Typical chain:**
|
|
24
|
+
```
|
|
25
|
+
/gflow:issue-assessment <N> → verdict + e2e-gate + reply artifact
|
|
26
|
+
↓ (if scope clear & verifiable)
|
|
27
|
+
issue-resolve <N> → worktree + TDD + draft PR for human review
|
|
28
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >
|
|
3
|
+
Drive an assessed gflow-cli issue (verdict CONFIRMED-BUG or LIKELY-BUG, with
|
|
4
|
+
localized verifiable scope) to a fix: isolated worktree off develop, test-first
|
|
5
|
+
fix, /gflow:check, then a DRAFT PR for human review. Mutating and gated — runs
|
|
6
|
+
inside a strict action envelope (never merges, never spends credits, never
|
|
7
|
+
marks a PR ready, never claims an unverified fix verified).
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# `/gflow:issue-resolve [issue number]`
|
|
11
|
+
|
|
12
|
+
**Read `skills/issue-resolve/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the issue to resolve.
|
|
13
|
+
|
|
14
|
+
> Do **not** call `Skill(skill="issue-resolve")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not Skill-tool-invocable (only `.claude/commands/gflow/*` are). Read the file directly instead.
|
|
15
|
+
|
|
16
|
+
Preconditions (from `/gflow:issue-assessment`): verdict ∈ {`CONFIRMED-BUG`, `LIKELY-BUG`}, scope single-surface, and the fix is verifiable in this environment (or the gap is carried into the PR as "needs human e2e"). The skill isolates a `bugfix/` worktree off `develop`, gates high-stakes changes through `/gflow:predict` + `/gflow:scenario`, fixes test-first (Opus plans → Sonnet codes → Opus reviews for non-trivial work), runs `/gflow:check`, opens a **draft** PR with a Verification-status section, runs `/gflow:pr-council-review`, and **stops** for a human to promote and merge.
|
|
17
|
+
|
|
18
|
+
**Chain:** `/gflow:issue-assessment <N>` → (if scope clear) `/gflow:issue-resolve <N>` → human promotes draft → human runs any headed/e2e check → merge.
|
|
@@ -93,10 +93,13 @@ jobs:
|
|
|
93
93
|
runs-on: ubuntu-latest
|
|
94
94
|
needs: test # wait for tests + coverage report
|
|
95
95
|
# Forked pull_request runs do not receive repository secrets, so SONAR_TOKEN
|
|
96
|
-
# is empty there and the scanner fails before analysis.
|
|
97
|
-
#
|
|
96
|
+
# is empty there and the scanner fails before analysis. Dependabot-triggered
|
|
97
|
+
# runs are the same case: GitHub serves them the separate Dependabot secrets
|
|
98
|
+
# namespace, so SONAR_TOKEN is also empty even though the branch is in-repo.
|
|
99
|
+
# Keep SonarCloud on trusted pushes/internal PRs where the token is available.
|
|
98
100
|
if: >
|
|
99
101
|
always() &&
|
|
102
|
+
github.actor != 'dependabot[bot]' &&
|
|
100
103
|
(
|
|
101
104
|
github.event_name != 'pull_request' ||
|
|
102
105
|
github.event.pull_request.head.repo.full_name == github.repository
|
|
@@ -69,6 +69,15 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
69
69
|
- Run `/gflow:check` (or the Impeccable Routine) before every commit.
|
|
70
70
|
- All releases require a signed annotated tag (`git tag -s vX.Y.Z`); CI rejects unsigned tags.
|
|
71
71
|
|
|
72
|
+
## Working discipline — verify before you act
|
|
73
|
+
|
|
74
|
+
These rules exist because docs alone don't bind under momentum: a "check open PRs first" rule was already written and still got skipped, and a PR was merged without seeing an entangled open one. Follow them on every task.
|
|
75
|
+
|
|
76
|
+
- **Check what's already in flight before coding a fix, opening a PR, or merging.** Run `gh pr list` and `git ls-remote` first — another open PR may already touch the same issue or files. Reconcile against it; don't re-derive "the only thing left" from a stale handoff. (A `PreToolUse` hook also surfaces same-issue open PRs at `gh pr create`/`merge` time, but treat that as a backstop, not a substitute for looking.)
|
|
77
|
+
- **Truth is the CLI and running the code — not IDE/LSP "reminder" diagnostics.** Editor / `pyright`-in-worktree warnings go stale for an entire session and throw false positives (especially across multiple worktrees). Confirm with `ruff` / `pyright` / `pytest` from the terminal — or trust the worktree's own venv — never an IDE squiggle.
|
|
78
|
+
- **Verify third-party runtime behavior empirically before wiring it in.** Don't assume how an external library, API, or browser actually behaves — exercise it once and observe, then build on the observed contract.
|
|
79
|
+
- **If a claim can't be verified in the current environment, it's LIKELY — not CONFIRMED.** Keep the issue open, reference it with `Refs #N` (not `Closes #N`), and ship diagnostics rather than a blind fix. When you can't reproduce it, hand the fix to whoever can.
|
|
80
|
+
|
|
72
81
|
## Skills reference (cross-tool)
|
|
73
82
|
|
|
74
83
|
The `skills/` directory ships installable agent skill docs in plain Markdown with YAML frontmatter. Any agent can consume them directly:
|
|
@@ -7,6 +7,73 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.24.0] — 2026-07-01
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`--project` on `video t2v`/`i2v`/`r2v` (#233)**: generate into an existing Flow
|
|
15
|
+
project instead of always creating a scratch project, matching `image t2i`/`i2i`.
|
|
16
|
+
Lets programmatic callers (e.g. a multi-clip storyboard worker) share one project
|
|
17
|
+
across several video generations instead of leaving one throwaway project per clip.
|
|
18
|
+
- **`project` parameter on the MCP `gflow_generate_image` / `gflow_generate_video`
|
|
19
|
+
tools**: mirrors the CLI `--project` flag so MCP callers can also target an existing
|
|
20
|
+
Flow project (validated against the same id format). Completes `--project` parity
|
|
21
|
+
across the CLI and MCP surfaces.
|
|
22
|
+
|
|
23
|
+
## [0.23.0] — 2026-07-01
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **MCP generation is now functional (#228)**: the `gflow_generate_image` and
|
|
28
|
+
`gflow_generate_video` MCP tools — previously non-functional stubs — now enqueue onto
|
|
29
|
+
the FlowWorker queue and run end-to-end, with the background worker owning download and
|
|
30
|
+
history recording. The `tools` parameter (e.g. `creative-director`) is now applied to
|
|
31
|
+
expand the prompt before generation (it was previously accepted but never applied), and
|
|
32
|
+
reference images are supported across the image (`i2i`) and video (`i2v` / `r2v`) tools.
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- **macOS generation 401 — resolved (#222, #230)**: Flow cookies are now read from the
|
|
37
|
+
full cookie jar filtered by domain instead of a path-`/` URL filter that silently
|
|
38
|
+
dropped the `/fx`-scoped `__Secure-next-auth.session-token`; and on macOS — where the
|
|
39
|
+
headed generation context can intermittently fail to decrypt the on-disk cookie store —
|
|
40
|
+
the session is seeded into the context from a snapshot captured pre-launch via the
|
|
41
|
+
working `--password-store=basic` reader. Verified end-to-end on macOS (Apple Silicon) by
|
|
42
|
+
the reporter. Thanks @gunalak.
|
|
43
|
+
- **MCP video task safety (#228)**: `i2v` now requires `initial_frame` and `r2v` requires
|
|
44
|
+
`reference_images`, validated at the tool boundary with a clear error; a post-success
|
|
45
|
+
recording failure no longer flips a credit-spent video to `failed`; and any
|
|
46
|
+
non-`completed` task status is reported as a failure rather than a false success.
|
|
47
|
+
- **Chrome channel on Chromium-only hosts**: `channel_for_profile()` now gates
|
|
48
|
+
Playwright's `channel="chrome"` on a new `_is_playwright_chrome_channel_available()`
|
|
49
|
+
check that probes only the exact Google-Chrome paths Playwright hardcodes, instead
|
|
50
|
+
of `is_chrome_available()` (which also accepts Chromium). On a host with only
|
|
51
|
+
Chromium installed, the CLI no longer requests `channel="chrome"` and fails with
|
|
52
|
+
`Chromium distribution 'chrome' is not found at /opt/google/chrome/chrome`; it falls
|
|
53
|
+
back to bundled Chromium and logs an actionable warning (#219).
|
|
54
|
+
- **Text-to-image extra-image billing**: the generation-settings trigger selector now
|
|
55
|
+
requires `button[aria-haspopup='menu']` (aliased to `MODE_SWITCH_TRIGGER_SELECTORS`),
|
|
56
|
+
preventing a mis-click on an icon-only aspect thumbnail that skipped the count panel
|
|
57
|
+
and left Flow's own default count (typically 2) in effect — billing extra generations
|
|
58
|
+
while the CLI saved only one (#219).
|
|
59
|
+
- **Extra-image observability**: `generate_image()` now logs a
|
|
60
|
+
`client.generate_image_extra_returned` warning when the transport returns more images
|
|
61
|
+
than the requested `count=1`, so silent over-generation is surfaced to the user (#219).
|
|
62
|
+
- **macOS generation 401 — fail loud (#222)**: a `chrome`-strategy profile that is
|
|
63
|
+
silently downgraded to bundled Chromium at generation launch now raises instead of
|
|
64
|
+
running logged-out, so the macOS auth failure surfaces at its cause rather than as an
|
|
65
|
+
opaque later `401`.
|
|
66
|
+
|
|
67
|
+
### Diagnostics
|
|
68
|
+
|
|
69
|
+
- **Persistent-context cookie state (#222)**: generation launch now logs the resolved
|
|
70
|
+
`cookies_db_path` (`client.persistent_context_launch`) and the launched context's own
|
|
71
|
+
cookie state (`client.context_cookie_state`: `flow_session_cookie_present` / count /
|
|
72
|
+
expiry — **never values**, safe to paste publicly). This splits a cookie-**load**
|
|
73
|
+
failure (the macOS persistent context cannot decrypt the profile's cookies) from a
|
|
74
|
+
server-side rejection — the observability that localized the macOS `401` root cause,
|
|
75
|
+
now resolved (see the #222/#230 entry above).
|
|
76
|
+
|
|
10
77
|
## [0.22.0] — 2026-06-28
|
|
11
78
|
|
|
12
79
|
### Added
|
|
@@ -1628,7 +1695,9 @@ shell-script template that branches on these codes.
|
|
|
1628
1695
|
|
|
1629
1696
|
First skeleton. Not functional end-to-end yet.
|
|
1630
1697
|
|
|
1631
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1698
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.24.0...HEAD
|
|
1699
|
+
[0.24.0]: https://github.com/ffroliva/gflow-cli/compare/v0.23.0...v0.24.0
|
|
1700
|
+
[0.23.0]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...v0.23.0
|
|
1632
1701
|
[0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
|
|
1633
1702
|
[0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
|
|
1634
1703
|
[0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
## Active phase
|
|
27
27
|
|
|
28
|
-
- **Decoupled Daemon/Worker Plan:** The
|
|
28
|
+
- **Decoupled Daemon/Worker Plan:** The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). The remaining headless SSE Daemon + Tauri/React editor blueprint is scheduled in [gflow-studio-scaffold/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md) and [rest-api-layer/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md).
|
|
29
29
|
- **Core Lesson (Retrospective):** Kept `gflow-cli` strictly headless (running Uvicorn and FastMCP over localhost HTTP/SSE). Bypassed browser context locks by serializing task writes in SQLite queue, allowing parallel client database reads via WAL mode.
|
|
30
30
|
|
|
31
31
|
See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
|
|
@@ -14,6 +14,28 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
+
### macOS: generation runs logged-out → HTTP 401, even with `--browser chrome`
|
|
18
|
+
|
|
19
|
+
- **Status:** **RESOLVED in v0.23.0** ([#222](https://github.com/ffroliva/gflow-cli/issues/222),
|
|
20
|
+
fixed by [#230](https://github.com/ffroliva/gflow-cli/pull/230), @gunalak)
|
|
21
|
+
- **Severity:** High · **Affected:** all `gflow` generation on **macOS** with a
|
|
22
|
+
`chrome`-strategy profile; Windows was unaffected
|
|
23
|
+
|
|
24
|
+
On macOS, generation calls failed with **HTTP 401** (`AuthExpiredError` at
|
|
25
|
+
`project.createProject`) on a profile that `gflow auth login` and verification
|
|
26
|
+
accepted. Two corrections fixed it (verified end-to-end on macOS Apple Silicon):
|
|
27
|
+
|
|
28
|
+
1. **Cookie-read bug (unconditional).** The Flow cookie snapshot read the jar via
|
|
29
|
+
`ctx.cookies(["https://labs.google"])`, whose path-`/` filter silently dropped
|
|
30
|
+
the `/fx`-scoped `__Secure-next-auth.session-token`. Now the full jar is read
|
|
31
|
+
and filtered by domain, so the session token is captured.
|
|
32
|
+
2. **macOS headed-context decrypt (intermittent).** When the headed generation
|
|
33
|
+
context can't decrypt the on-disk store, the session is seeded from a snapshot
|
|
34
|
+
captured **pre-launch** via the working `--password-store=basic` reader. No-op on
|
|
35
|
+
Windows and on runs where the context decrypts natively.
|
|
36
|
+
|
|
37
|
+
Evidence: [LIVE_VERIFICATION_v0.23.0](docs/LIVE_VERIFICATION_v0.23.0.md).
|
|
38
|
+
|
|
17
39
|
### Flow's new full-page media-library UI breaks entity attach (A/B rollout)
|
|
18
40
|
|
|
19
41
|
- **Status:** **Open** — Flow-side staged rollout; tracked in
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.24.0
|
|
4
4
|
Summary: Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ffroliva/gflow-cli
|
|
6
6
|
Project-URL: Issues, https://github.com/ffroliva/gflow-cli/issues
|
|
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
|
58
58
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
59
59
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
60
60
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
61
|
-
Requires-Dist: ruff==0.15.
|
|
61
|
+
Requires-Dist: ruff==0.15.20; extra == 'dev'
|
|
62
62
|
Provides-Extra: gcs
|
|
63
63
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
64
64
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
@@ -366,7 +366,7 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
|
|
|
366
366
|
- **`expand_prompt` reconcile — DONE 2026-06-28 (PR #215).** The legacy `mcp/prompts.py` `expand_prompt` MCP prompt is **deprecated** in favor of the `creative-director` tool (client-visible `[DEPRECATED]` marker; kept functional; removal slated for a future major). See [PROMPT_EXPANSION § Relationship to expand_prompt](file:///C:/development/github/gflow-cli/docs/PROMPT_EXPANSION.md).
|
|
367
367
|
- **My Tools — DONE 2026-06-28 (PR #216).** User-authored TOMLs in `<GFLOW_CLI_HOME>/tools/*.toml` are loaded into the registry (override-a-builtin-with-warning; malformed fails loud).
|
|
368
368
|
- **Backlog — deferred by design:** the S3 `Tool.apply(ctx)→outcome` dispatch framework. The research doc gates it on a *second, non-prompt* tool (e.g. Mockup) — building it now with a single prompt-only implementer is the documented "premature uniformity (guessed contract)" anti-pattern.
|
|
369
|
-
- [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog)
|
|
369
|
+
- [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog) The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). Remaining: a local FastAPI/React filmmaking studio dashboard + HTTP/SSE MCP. Planned 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).
|
|
370
370
|
- [x] **Issue #92: Google account identity persistence shipped 2026-05-28 (PR #110).** After every `gflow auth login`, both auth strategies write the verified email to `$GFLOW_CLI_HOME/profile_<name>/.gflow_account`. `ProfileMeta.google_account` surfaces it; `gflow auth list` and `gflow auth list --json` display it. First-login auto-rename: when no `--profile` flag was given and the only profile is named `default`, it is renamed to the email local-part. `profile_store.rename_profile()` primitive added. Zero-credit smoke test (`tests/smoke/test_profile_account_smoke.py`) ships with backfill path for pre-existing profiles. LLM council (9-dim) run; all must-fix items applied before merge. See `KNOWN_ISSUES.md` § Resolved for full detail.
|
|
371
371
|
- [x] **`/gflow:pr-council-review` slash command shipped 2026-05-26 (PR #97).** Multi-dimensional LLM council for open PRs (4 baseline + 8 adaptive dimensions, mandatory memory-slug binding, draft-PR guard, YELLOW escape valve, live-verify gate). Validated on PR #93; self-audited by 3-agent meta-council surfacing 13 must-fix items applied before merge. See memory `[[llm-council-code-review-pr93]]`.
|
|
372
372
|
- **Phase A (Backlog — Portability):** extract command body into `skills/pr-council-review/SKILL.md` so Gemini CLI / Codex / Cursor / Aider can consume it. Keep `.claude/commands/gflow/pr-council-review.md` as a thin wrapper. Memory: `[[pr-council-review-portability-backlog]]`.
|
|
@@ -37,7 +37,6 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
|
|
|
37
37
|
| **[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 |
|
|
38
38
|
| **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (HTTP/SSE), the tools/prompts/resources surface, CLI↔MCP §61 parity, security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/SSE transports |
|
|
39
39
|
| **[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 |
|
|
40
|
-
| **[docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md](superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md)** | Integrated local Filmmaking Studio Web UI, Flow Worker queue daemon, and MCP SSE server design spec (HLD/LLD) | Understanding the integrated HTTP/SSE daemon architecture |
|
|
41
40
|
| **[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) |
|
|
42
41
|
| **[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) |
|
|
43
42
|
| **[tasks/lessons.md](../tasks/lessons.md)** | Running notebook of patterns + reviewer findings, dated and traced to commits | Starting a new phase; debugging "why did the council flag this?" |
|
|
@@ -118,7 +117,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
118
117
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
119
118
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
120
119
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
121
|
-
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_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)
|
|
120
|
+
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.24.0](LIVE_VERIFICATION_v0.24.0.md) (--project parity across CLI + MCP — automated coverage; live gen auth-gated). Prior: [v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
122
121
|
**"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships.
|
|
123
122
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
124
123
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -82,5 +82,39 @@ Owner checklist (run after publish, then fill **Post-tag evidence**):
|
|
|
82
82
|
|
|
83
83
|
## Post-tag evidence
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
### Tool / expander / My-Tools — ✅ live-verified 2026-06-28 (real Gemini API)
|
|
86
|
+
|
|
87
|
+
Run with the owner's `GFLOW_CLI_GEMINI_API_KEY` (from `.env.local`), CLI v0.22.0:
|
|
88
|
+
|
|
89
|
+
| # | Check | Command | Result |
|
|
90
|
+
|---|---|---|---|
|
|
91
|
+
| 1 | Tool registered | `gflow tools list` | `creative-director` listed (Title/Category/Description correct) ✅ |
|
|
92
|
+
| 2 | Real expansion | `gflow tools run creative-director "a cat on a couch" --style cinema --json` | `was_expanded: true`; 16→1189 chars; vivid 5-component prose naming a real camera (Sony A7R IV / Cooke S7/i) + prestige anchor (Kinfolk); structlog `prompt_expanded` (model `gemini-2.5-flash`) ✅ |
|
|
93
|
+
| 3 | Banned-keyword guarantee | `gflow tools run creative-director "a luxury watch" --style product` | output scanned against all 13 banned terms → **none present** ✅ |
|
|
94
|
+
| 4 | Never-fatal (bad key) | `GFLOW_CLI_GEMINI_API_KEY=invalid-key-xyz gflow tools run creative-director "a dog" --json` | `was_expanded: false`, original returned, no error/exit ✅ |
|
|
95
|
+
| 5 | Video category style | `gflow tools run creative-director "a city at night" --style cinematic` | rewrites with cinematic vocabulary (video-gated style resolves) ✅ |
|
|
96
|
+
| 6 | "My Tools" loader | wrote `<HOME>/tools/haiku-bot.toml`; `GFLOW_CLI_HOME=<tmp> gflow tools list` | user tool `haiku-bot` listed **alongside** the builtin `creative-director` ✅ |
|
|
97
|
+
|
|
98
|
+
These exercise the whole prompt-tool path (registry → `apply_tool` → `build_instruction` → live
|
|
99
|
+
`PromptExpander.expand` → `strip_banned_keywords`), the never-fatal contract, category gating, and
|
|
100
|
+
the user-dir loader — end to end against the real Gemini endpoint.
|
|
101
|
+
|
|
102
|
+
### Generation recording (`expanded_prompt` + `metadata_json.tool` + redaction) — ✅ live-verified 2026-06-28
|
|
103
|
+
|
|
104
|
+
Real credit-free `image t2i` generations on the authenticated `denon82` profile (agentic UI
|
|
105
|
+
cohort, model NARWHAL), CLI v0.22.0:
|
|
106
|
+
|
|
107
|
+
**Store mode** — `gflow image t2i "a fox in the snow" --tool creative-director:style=cinema --profile denon82`:
|
|
108
|
+
- File: a real **729 KB JPEG** (magic bytes `ff d8 ff`) written to the `--out` dir ✅
|
|
109
|
+
- `prompt` = `"a fox in the snow"` (the **original**) ✅
|
|
110
|
+
- `expanded_prompt` = the 971-char rewrite (`"A sleek, mature red fox, …"`) ✅
|
|
111
|
+
- `operations.metadata_json.tool` = `{name: "creative-director", version: "1", model: "gemini-2.5-flash", params: {style: "cinema"}, config_hash: "e8399085…"}` ✅
|
|
112
|
+
|
|
113
|
+
**Redacted mode** — same command with `GFLOW_CLI_HISTORY_PROMPTS=redacted` (`"a red barn at dusk"`):
|
|
114
|
+
- `prompt` = `None`, `prompt_redacted` = `1`, `expanded_prompt` = `None` (both withheld) ✅
|
|
115
|
+
- `metadata_json.tool` = `{name, version, params_hash, config_hash}` only — no `model`, no raw
|
|
116
|
+
`params` (replaced by `params_hash`) ✅
|
|
117
|
+
- `config_hash` identical to store mode (same resolved `ToolConfig`) — tamper-evidence confirmed ✅
|
|
118
|
+
|
|
119
|
+
**All 5 ledger layers cleared** (file + magic bytes + real generation + DB rows in both prompt
|
|
120
|
+
modes + structlog `prompt_expanded`/`ui_driver.bound`). v0.22.0 live verification is **complete**.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Live Verification — v0.23.0
|
|
2
|
+
|
|
3
|
+
Release date: 2026-07-01. This document records what was exercised against **live
|
|
4
|
+
Google Flow** (credit-free wherever possible) for the user-facing changes in v0.23.0,
|
|
5
|
+
following the 5-layer verification ledger.
|
|
6
|
+
|
|
7
|
+
## Scope
|
|
8
|
+
|
|
9
|
+
| Change | Surface | Live-verified? |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| **#228** — MCP generation now functional (tool → FlowWorker → download → record; `tools` applied) | MCP `gflow_generate_image` / `gflow_generate_video` | 🟡 Wiring proven live (tool → worker → real Flow REST + structured-error translation); the final image-write layer was **not** run live (expired session — environmental) — see below |
|
|
12
|
+
| **#230 / #222** — macOS generation 401 fixed (path=/ cookie read + headed-context seed) | `auth/cookies.py`, `api/client.py` (macOS headed Chrome) | ✅ Reporter-verified end-to-end on macOS (Apple Silicon) |
|
|
13
|
+
| **#219** — Chromium-only-host chrome-channel gate + T2I extra-image guard | `browser_manager.py`, image path | ⚠️ Not reproducible on this maintainer box (Google Chrome is installed) — covered by automated tests |
|
|
14
|
+
|
|
15
|
+
## #228 — MCP generation path (credit-free image)
|
|
16
|
+
|
|
17
|
+
Exercised the **wired MCP tool path in-process** (`gflow_generate_image`, profile
|
|
18
|
+
`denon82`, aspect 1:1, count 1) — the exact path this release fixes (tool → queue →
|
|
19
|
+
`FlowWorker.process_task` → real `FlowApiClient` → real Flow REST).
|
|
20
|
+
|
|
21
|
+
**Proven live (structlog evidence, 2026-07-01):**
|
|
22
|
+
- `mcp.tool.profile_resolved requested=denon82 resolved=denon82` — profile resolution
|
|
23
|
+
- `mcp.tool.task_enqueued task_type=t2i` → `Processing task` — enqueue + worker dispatch
|
|
24
|
+
- `client.persistent_context_launch channel=chrome chrome_strategy_requested=True cookies_db_present=True password_store_basic=True` — real headed Chrome, chrome-strategy
|
|
25
|
+
- `client.context_cookie_state context_cookie_count=57 flow_session_cookie_present=True google_sapisid_present=True` — cookies loaded
|
|
26
|
+
- Reached a **real Flow REST call**: `POST project.createProject`
|
|
27
|
+
- **Structured-error translation confirmed** (the core #228 wiring): the server returned
|
|
28
|
+
HTTP 401 → worker raised `AuthExpiredError` → the MCP tool returned a clean RFC-9457
|
|
29
|
+
failure envelope:
|
|
30
|
+
```json
|
|
31
|
+
{"status":"failed","error":{"type":".../auth-expired","title":"Authentication expired",
|
|
32
|
+
"status":401,"detail":"HTTP 401","remediation_hint":"Run `gflow auth login ...`",
|
|
33
|
+
"exit_code":3}}
|
|
34
|
+
```
|
|
35
|
+
This exercises exactly the tool→worker→status-translation path the release wires, plus
|
|
36
|
+
the "any non-`completed` status → failure" behavior added in this release.
|
|
37
|
+
|
|
38
|
+
**Not completed live (environmental, not a code defect):** the actual image creation +
|
|
39
|
+
download + `local_files` recording did not run because the `denon82` Flow session was
|
|
40
|
+
**server-side expired** (HTTP 401 on a fully-loaded cookie jar — a stale session token,
|
|
41
|
+
distinct from the #222 macOS decrypt bug). Completing the image-write layer requires an
|
|
42
|
+
interactive `gflow auth login --profile denon82` (browser login). The generation +
|
|
43
|
+
download + recording code beneath the MCP wiring is the **same shared FlowWorker /
|
|
44
|
+
FlowApiClient path** exercised live in prior releases (CLI image path) and by the
|
|
45
|
+
automated suite.
|
|
46
|
+
|
|
47
|
+
## #230 / #222 — macOS generation 401
|
|
48
|
+
|
|
49
|
+
Verified **end-to-end on macOS (Apple Silicon) by the issue reporter** (@gunalak), both
|
|
50
|
+
branches of the fix (PR #230 body evidence):
|
|
51
|
+
- **Seed fires** (headed decrypt loaded nothing): `context_cookie_count=0
|
|
52
|
+
flow_session_cookie_present=False` → `preread_count=8 preread_session=True` →
|
|
53
|
+
`context_cookies_seeded seeded_session=True` → `createProject` + `batchGenerateImages`
|
|
54
|
+
**200** → image written.
|
|
55
|
+
- **Native decrypt** (seed is a no-op): `context_cookie_count=7
|
|
56
|
+
flow_session_cookie_present=True` → **200** → image written.
|
|
57
|
+
|
|
58
|
+
Council review (`/gflow:pr-council-review` #230): correctness/security/auth/quality all
|
|
59
|
+
GREEN; tests/memory YELLOW (coverage-gap follow-up tracked).
|
|
60
|
+
|
|
61
|
+
## Automated coverage
|
|
62
|
+
|
|
63
|
+
- Full suite (this release tree): **1918 passed / 7 skipped** (pre-#230), plus **70
|
|
64
|
+
passed** on the #230-affected suites (`tests/api/test_client_launch_kwargs.py`,
|
|
65
|
+
`tests/auth/`) after the merge.
|
|
66
|
+
- `pyright src`: 0 errors. `ruff check` / `ruff format --check`: clean.
|
|
67
|
+
- New MCP-wiring regression tests (`tests/mcp/test_tools_wired.py`,
|
|
68
|
+
`tests/worker/test_daemon.py`) assert the full enqueue → worker → status-translation
|
|
69
|
+
path and the `tool_specs` application.
|
|
70
|
+
|
|
71
|
+
## Follow-ups
|
|
72
|
+
|
|
73
|
+
- MCP → worker → download/record has no gated live e2e harness yet (tracked): a
|
|
74
|
+
`test_mcp_*_e2e.py` mirroring `test_daemon_e2e.py` (opt-in, credit-free image).
|
|
75
|
+
- Two #230 regression tests (falsifiable `/fx` cookie-path test + `_preread` capture
|
|
76
|
+
test) tracked as a post-merge follow-up.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Live Verification — v0.24.0
|
|
2
|
+
|
|
3
|
+
Release date: 2026-07-01. This release completes `--project` parity: `video
|
|
4
|
+
t2v/i2v/r2v` gain `--project` (#233/#234) and the MCP `gflow_generate_image` /
|
|
5
|
+
`gflow_generate_video` tools gain a `project` parameter (#235) — both let a caller
|
|
6
|
+
target an existing Flow project instead of a scratch one.
|
|
7
|
+
|
|
8
|
+
## Scope
|
|
9
|
+
|
|
10
|
+
| Change | Surface | Verification |
|
|
11
|
+
|---|---|---|
|
|
12
|
+
| **#234** — `--project` on `video t2v/i2v/r2v` (CLI) | `cli_video.py`, `_cli_helpers.py` | ✅ Automated — behavior tests assert the id threads to `generate_video(project_id=...)` for all three modes; default (no flag) → scratch project; bad id rejected at the CLI boundary. Full council review GREEN + Sonar 100% new-coverage. |
|
|
13
|
+
| **#235** — `project` param on MCP generate tools | `mcp/tools.py` | ✅ Automated — payload-threading tests assert `project` reaches `payload["project_id"]` (image + video), omitted → no `project_id`, bad id rejected before the worker. Reuses the CLI `_FLOW_ID_RE` validator. Council GREEN + Sonar pass. |
|
|
14
|
+
|
|
15
|
+
## Nature of the change (why automated coverage is sufficient here)
|
|
16
|
+
|
|
17
|
+
Neither change adds new generation plumbing: the worker/daemon already consumed
|
|
18
|
+
`payload["project_id"]` (daemon.py:97 image, :168 video) and `FlowApiClient.generate_video`
|
|
19
|
+
already accepted `project_id`. Both PRs only **surface + validate** the existing
|
|
20
|
+
capability at the CLI and MCP boundaries, and thread it into the already-wired payload.
|
|
21
|
+
The end-to-end "generate into an existing project" path (browser navigation to
|
|
22
|
+
`project_editor_url(locale, project_id)` → `entering_existing_project`) is the same code
|
|
23
|
+
prior releases exercised live for `image t2i --project`.
|
|
24
|
+
|
|
25
|
+
## Live generation status
|
|
26
|
+
|
|
27
|
+
A live credit-free run of `--project` against real Flow was **not** performed this cycle
|
|
28
|
+
because the available `denon82` profile's Flow session is server-side expired (HTTP 401 —
|
|
29
|
+
see [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md)); exercising it requires an
|
|
30
|
+
interactive `gflow auth login`. The project-targeting code path is shared with the
|
|
31
|
+
already-live-verified `image t2i --project` path, and is fully covered by the automated
|
|
32
|
+
behavior tests above.
|
|
33
|
+
|
|
34
|
+
## Automated coverage
|
|
35
|
+
|
|
36
|
+
- Full suite green on both PRs' CI (test matrix 3.11/3.12/3.13) at the merged tree.
|
|
37
|
+
- `pyright src`: 0 errors. `ruff check` / `ruff format --check`: clean.
|
|
38
|
+
- SonarCloud gate green on both PRs (#234 new-coverage 100%; #235 pass).
|
|
@@ -45,10 +45,10 @@ Both Click CLI (`src/gflow_cli/cli.py`) and MCP Server (`src/gflow_cli/mcp/`) ar
|
|
|
45
45
|
The server registers three protocol surfaces:
|
|
46
46
|
|
|
47
47
|
### Tools (Executable actions)
|
|
48
|
-
* `gflow_generate_image(prompt, model, aspect, count, seed)`: Triggers text-to-image (Imagen
|
|
49
|
-
* `gflow_generate_video(prompt,
|
|
50
|
-
* `gflow_list_projects(
|
|
51
|
-
* `gflow_list_characters(
|
|
48
|
+
* `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile, project)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `reference_images` switches to i2i; `project` generates into an existing Flow project id (mirrors CLI `--project`).
|
|
49
|
+
* `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, tools, profile, project)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `i2v` requires `initial_frame`, `r2v` requires `reference_images`; `project` generates into an existing Flow project id (mirrors CLI `--project`).
|
|
50
|
+
* `gflow_list_projects(profile, limit)`: Queries SQLite catalog for recent generation folders.
|
|
51
|
+
* `gflow_list_characters(profile)`: Lists Flow Character entities (requires an active browser session).
|
|
52
52
|
|
|
53
53
|
### Prompts (Orchestration templates)
|
|
54
54
|
* `expand_prompt`: Helps the agent structure simple ideas into Google's official 5-component prompt formula (Subject + Action + Location + Composition + Style) before sending them to the generation tools.
|
|
@@ -4,9 +4,38 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
+
**v0.24.0 — alpha.** **`--project` parity across CLI + MCP.** The video commands
|
|
8
|
+
(`video t2v`/`i2v`/`r2v`) gain `--project <id>` to generate into an existing Flow project
|
|
9
|
+
instead of a scratch one (#233/#234), matching `image t2i`/`i2i`; and the MCP
|
|
10
|
+
`gflow_generate_image` / `gflow_generate_video` tools gain a matching `project` parameter
|
|
11
|
+
(#235), so agent callers get the same capability. Both surface an already-wired worker
|
|
12
|
+
capability (`payload["project_id"]`) and validate the id identically. Carries forward
|
|
13
|
+
v0.23.0 (MCP generation live + macOS 401 fix). Verification:
|
|
14
|
+
[LIVE_VERIFICATION_v0.24.0](LIVE_VERIFICATION_v0.24.0.md).
|
|
15
|
+
|
|
16
|
+
**Develop (unreleased, post-v0.24.0):** *(empty — develop is the staging branch for the next release).*
|
|
17
|
+
|
|
18
|
+
<details><summary>v0.23.0 — MCP generation live + macOS 401 fixed</summary>
|
|
19
|
+
|
|
20
|
+
**v0.23.0 — alpha.** **MCP generation goes live + macOS 401 fixed.** The MCP server's
|
|
21
|
+
`gflow_generate_image` / `gflow_generate_video` tools — previously non-functional stubs —
|
|
22
|
+
are now wired end-to-end to the FlowWorker queue (background worker owns download +
|
|
23
|
+
history recording), the `tools` prompt-expansion parameter is actually applied, and i2v/r2v
|
|
24
|
+
require their frame/reference inputs at the tool boundary. The long-standing macOS
|
|
25
|
+
generation `401` (#222) is resolved (#230, @gunalak): Flow cookies are read from the full
|
|
26
|
+
jar by domain instead of a path-`/` filter that dropped the `/fx`-scoped session token, and
|
|
27
|
+
the headed context is seeded from a pre-launch snapshot when macOS can't decrypt the store.
|
|
28
|
+
Carries forward v0.22.0 (Tools framework) + v0.21.0 (MCP server). Verification:
|
|
29
|
+
[LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP wiring proven live; #222
|
|
30
|
+
reporter-verified e2e on macOS).
|
|
31
|
+
|
|
32
|
+
</details>
|
|
33
|
+
|
|
34
|
+
<details><summary>v0.22.0 — Tools framework ("Creative Director")</summary>
|
|
35
|
+
|
|
7
36
|
**v0.22.0 — alpha.** **Tools framework ("Creative Director").** A TOML-defined prompt-tool system: `creative-director` rewrites a terse prompt into a vivid one via Google's five-component formula (public Gemini API, never-fatal), with 15 category-gated domain styles and deterministic banned-keyword stripping. Invoke it via the new `gflow tools list/show/run` group or the uniform `-t`/`--tool` option on every generation command (`image t2i`/`i2i`/`batch`, `video t2v`/`i2v`/`r2v`/`chain`), replacing the never-released `-e/--expand`. History records the original prompt, the submitted `expanded_prompt`, and `metadata_json.tool` provenance (redaction-honoring). **"My Tools"**: user-authored TOMLs in `<GFLOW_CLI_HOME>/tools/*.toml` load automatically. MCP parity via `gflow_list_tools` + a `tools` array param; the legacy `expand_prompt` MCP prompt is deprecated. The Gemini expander gained an overall wall-clock budget. Carries forward v0.21.0 (MCP server over stdio + HTTP/SSE). Verification: [LIVE_VERIFICATION_v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (CI/automated complete; live owner-run pending).
|
|
8
37
|
|
|
9
|
-
|
|
38
|
+
</details>
|
|
10
39
|
|
|
11
40
|
## Milestone history
|
|
12
41
|
|
|
@@ -68,6 +97,8 @@
|
|
|
68
97
|
| Aspect-ratio overrides under Agentic & Classic cohorts + `GFLOW_CLI_PREFER_CLASSIC` (#193) | ✅ done (v0.20.0 / v0.20.1) |
|
|
69
98
|
| MCP server (`gflow mcp run` stdio + `gflow serve` HTTP/SSE) + daemon/queue scaffolding | ✅ done (v0.21.0) |
|
|
70
99
|
| Tools framework: `gflow tools` group + `--tool` + `creative-director` + "My Tools" + MCP parity | ✅ done (v0.22.0) |
|
|
100
|
+
| MCP generation wired to FlowWorker (tool→queue→download→record) + `tools` applied + i2v/r2v boundary validation | ✅ done (v0.23.0) |
|
|
101
|
+
| macOS generation 401 fixed — `/fx` cookie-path read + headed-context seed (#222/#230) | ✅ done (v0.23.0) |
|
|
71
102
|
| `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
|
|
72
103
|
| Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
|
|
73
104
|
| Provider abstraction for official Veo 3.1 API | ⏳ planned |
|
|
@@ -438,7 +438,11 @@ All prompts in a batch share one Flow project. The editor is opened once; each p
|
|
|
438
438
|
Generate a video from a text prompt only.
|
|
439
439
|
|
|
440
440
|
```text
|
|
441
|
-
gflow video t2v PROMPT [--model] [--duration] [--count] [--aspect] [--profile] [-t/--tool] [--out-dir]
|
|
441
|
+
gflow video t2v PROMPT [--model] [--duration] [--count] [--aspect] [--profile] [-t/--tool] [--project] [--out-dir]
|
|
442
|
+
|
|
443
|
+
Options:
|
|
444
|
+
--project ID Generate in this EXISTING Flow project instead of a
|
|
445
|
+
scratch project (see "Sharing one project across calls").
|
|
442
446
|
```
|
|
443
447
|
|
|
444
448
|
```bash
|
|
@@ -472,6 +476,8 @@ Arguments:
|
|
|
472
476
|
Options:
|
|
473
477
|
--initial-frame PATH Initial frame to animate. Canonical form; replaces the positional IMAGE.
|
|
474
478
|
--end-frame PATH Optional end frame — Flow interpolates initial frame -> end frame.
|
|
479
|
+
--project ID Generate in this EXISTING Flow project instead of a
|
|
480
|
+
scratch project (see "Sharing one project across calls").
|
|
475
481
|
```
|
|
476
482
|
|
|
477
483
|
```bash
|
|
@@ -491,7 +497,9 @@ images. Per-model cap: `omni-flash` ≤7, the `veo-*` models ≤3. Fires
|
|
|
491
497
|
gflow video r2v PROMPT --ref IMG [--ref IMG ...] [--model] [--duration] [--count] [--aspect] [...]
|
|
492
498
|
|
|
493
499
|
Options:
|
|
494
|
-
--ref PATH
|
|
500
|
+
--ref PATH Reference image; repeat for up to 7 (omni-flash) / 3 (veo). [required]
|
|
501
|
+
--project ID Generate in this EXISTING Flow project instead of a scratch
|
|
502
|
+
project (see "Sharing one project across calls").
|
|
495
503
|
```
|
|
496
504
|
|
|
497
505
|
```bash
|
|
@@ -499,6 +507,19 @@ gflow video r2v "a knight in this armor walks forward" --ref armor.png
|
|
|
499
507
|
gflow video r2v "blend these worlds" --ref a.png --ref b.png --ref c.png --model omni-flash
|
|
500
508
|
```
|
|
501
509
|
|
|
510
|
+
### Sharing one project across calls
|
|
511
|
+
|
|
512
|
+
By default each `video t2v` / `i2v` / `r2v` call creates its own scratch Flow
|
|
513
|
+
project. Pass `--project <id>` (same contract as `image t2i`/`i2i` — see
|
|
514
|
+
[`gflow image t2i`](#gflow-image-t2i)) to generate into an existing project
|
|
515
|
+
instead, e.g. to avoid one-throwaway-project-per-clip when scripting a
|
|
516
|
+
multi-clip storyboard:
|
|
517
|
+
|
|
518
|
+
```bash
|
|
519
|
+
gflow video t2v "establishing shot" --project PROJ123
|
|
520
|
+
gflow video t2v "close-up reaction" --project PROJ123
|
|
521
|
+
```
|
|
522
|
+
|
|
502
523
|
## `gflow video batch`
|
|
503
524
|
|
|
504
525
|
> ⚠️ **Not yet implemented.** The `batch` subcommand currently exits with
|
|
@@ -509,10 +530,12 @@ gflow video r2v "blend these worlds" --ref a.png --ref b.png --ref c.png --model
|
|
|
509
530
|
### Workaround — shell for-loop
|
|
510
531
|
|
|
511
532
|
Until the manifest runner lands, you can drive sequential video generations
|
|
512
|
-
through a plain shell loop.
|
|
513
|
-
its **own Flow project**, so the resulting videos
|
|
514
|
-
`project_id` (unlike `gflow image batch`, which mounts one
|
|
515
|
-
all prompts) — but they DO get generated and downloaded
|
|
533
|
+
through a plain shell loop. Without `--project`, each `gflow video t2v` /
|
|
534
|
+
`i2v` / `r2v` call opens its **own Flow project**, so the resulting videos
|
|
535
|
+
will NOT share a `project_id` (unlike `gflow image batch`, which mounts one
|
|
536
|
+
project across all prompts) — but they DO get generated and downloaded. Pass
|
|
537
|
+
the same `--project <id>` to every call in the loop (see "Sharing one project
|
|
538
|
+
across calls" above) if you want them to land in one project instead:
|
|
516
539
|
|
|
517
540
|
```bash
|
|
518
541
|
# bash / WSL / macOS — one prompt per line
|