gflow-cli 0.61.0__tar.gz → 0.62.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.61.0 → gflow_cli-0.62.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.env.template +2 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/ci.yml +10 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.gitignore +5 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/CHANGELOG.md +157 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/KNOWN_ISSUES.md +19 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/PKG-INFO +1 -1
- {gflow_cli-0.61.0/website → gflow_cli-0.62.0}/docs/CONFIGURATION.md +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/INDEX.md +2 -2
- gflow_cli-0.62.0/docs/LIVE_VERIFICATION_v0.62.0.md +115 -0
- {gflow_cli-0.61.0/website → gflow_cli-0.62.0}/docs/MCP.md +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/USAGE.md +4 -2
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md +10 -0
- gflow_cli-0.62.0/docs/superpowers/specs/2026-08-27-changelog-modal-precondition-design.md +265 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/pyproject.toml +1 -1
- gflow_cli-0.62.0/scripts/dev/measure_locale_probe.py +109 -0
- gflow_cli-0.62.0/scripts/dev/spike_changelog_capture.py +308 -0
- gflow_cli-0.62.0/scripts/dev/spike_locale_poison.py +135 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/verify_language_agnostic.py +6 -3
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/llm-council/SKILL.md +5 -3
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/client.py +45 -12
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/routes.py +25 -3
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/ui_automation.py +240 -21
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/ui_automation_video.py +53 -3
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_data.py +14 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_image.py +4 -3
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_project.py +17 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/config.py +13 -2
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/queries.py +12 -12
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/tools.py +12 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/profile_store.py +83 -1
- gflow_cli-0.62.0/tests/api/test_client_locale_cache.py +204 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_ui_mode.py +7 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_locale_navigation.py +46 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_navigation_settled.py +11 -2
- gflow_cli-0.62.0/tests/api/transports/test_overlay_precondition.py +471 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation.py +45 -6
- gflow_cli-0.62.0/tests/data/test_null_columns_stay_null.py +126 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +6 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_sidebar_recovery_e2e.py +9 -1
- gflow_cli-0.62.0/tests/fixtures/changelog_modal_page.html +102 -0
- gflow_cli-0.62.0/tests/test_profile_store_locale.py +152 -0
- gflow_cli-0.62.0/tests/test_project_list_urls.py +228 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/uv.lock +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0/website}/docs/CONFIGURATION.md +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/KNOWN_ISSUES.md +19 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0/website}/docs/MCP.md +1 -1
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/USAGE.md +4 -2
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.gitattributes +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/deps-watch.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/pages.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/scorecard.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.github/workflows/selector-probe.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/.secrets.baseline +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/AGENTS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/CLAUDE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/LICENSE +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/RELEASE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/ROADMAP.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/deploy/logrotate-pr-triage +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docker-compose.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.60.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.61.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-21-selector-registry.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/index.html +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/llms.txt +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/Dockerfile.triage +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/entrypoint.sh +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/package-lock.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/package.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/pr_triage_autopilot.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/autopilot/run_sandboxed_review.sh +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/canary/register_task.ps1 +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/canary/run_canary.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/live_verify_policy_400_v060.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/live_verify_video_model_select.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_model_inventory.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_trpc_origin_referer_401.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/spike_video_tab_dom.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/verify_locale_navigation_race.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/dev/verify_model_attribution.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/diag/diag_aisandbox_bearer.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/probe/run_probe.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/probe/spike_auth_matrix.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/README.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/sonar-project.properties +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/diagnostics.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/grading.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/model.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/flow_selectors/registry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/services/catalog_sync.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_routes_locale.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_model_selection_loud.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_policy_400.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/api/transports/test_video_model_selection_loud.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/autopilot/test_pr_triage_autopilot.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/fixtures/flow_model_inventory.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/fixtures/flow_project_listing_media.json +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/flow_selectors/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_grading.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_model.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_model_governance.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_registry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/flow_selectors/test_report.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_canary_classify.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_canary_reexec.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/scripts/test_workflow_hardening.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_media_attribution.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_config.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_errors_classification.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_incident_generation_requests.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_media.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_self_documenting_errors.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/index.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/requirements.in +0 -0
- {gflow_cli-0.61.0 → gflow_cli-0.62.0}/website/requirements.txt +0 -0
|
@@ -173,7 +173,8 @@
|
|
|
173
173
|
# `patchright install chromium`. Unset to revert to the default playwright engine.
|
|
174
174
|
# GFLOW_CLI_BROWSER_ENGINE=playwright
|
|
175
175
|
|
|
176
|
-
# Which Flow UI arm a command needs: auto (
|
|
176
|
+
# Which Flow UI arm a command needs: auto (default — no arm asked for, so it
|
|
177
|
+
# resolves to classic, the arm that can satisfy a generation request) | classic
|
|
177
178
|
# (require the hard aspect controls) | agentic (require the chat surface; needed
|
|
178
179
|
# for -i instructions). gflow switches to the required arm, verifies via re-probe,
|
|
179
180
|
# and aborts with exit 28 (retryable — the cohort flaps per load) if it can't be
|
|
@@ -205,6 +205,16 @@ jobs:
|
|
|
205
205
|
- name: Type check
|
|
206
206
|
run: uv run pyright src
|
|
207
207
|
|
|
208
|
+
# The overlay-precondition tests (#593) drive the captured changelog markup in
|
|
209
|
+
# a real headless Chromium — a mock cannot tell you whether
|
|
210
|
+
# `[role='dialog']:has(a[href*='changelog']) button` resolves against Flow's
|
|
211
|
+
# actual DOM, only a real CSS engine can. They skip cleanly when the browser is
|
|
212
|
+
# absent, which would make them silently decorative in CI, so one job in the
|
|
213
|
+
# matrix installs it. No account, no network, no credits.
|
|
214
|
+
- name: Install Chromium (real-DOM fixture tests)
|
|
215
|
+
if: matrix.python-version == '3.13'
|
|
216
|
+
run: uv run playwright install chromium --with-deps
|
|
217
|
+
|
|
208
218
|
- name: Test (smoke only) + coverage
|
|
209
219
|
# e2e/live tests require a logged-in Chromium profile and may spend
|
|
210
220
|
# Flow credits. pyproject.toml excludes both markers by default; CI
|
|
@@ -66,6 +66,11 @@ test_assets/debug_*/
|
|
|
66
66
|
# Phase-2 live-spike capture outputs — NEVER commit (may contain real API payloads)
|
|
67
67
|
scripts/dev/_spike_out/
|
|
68
68
|
|
|
69
|
+
# HAR captures (GFLOW_CLI_HAR_PATH) — full request/response bodies, headers and
|
|
70
|
+
# auth cookies. The _spike_out rule only covers the default location; a HAR
|
|
71
|
+
# written anywhere else must not be committable either.
|
|
72
|
+
*.har
|
|
73
|
+
|
|
69
74
|
# Agent session marker — machine/session-local handoff state, regenerated per run
|
|
70
75
|
.continue-here.md
|
|
71
76
|
|
|
@@ -7,6 +7,161 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.62.0] — 2026-08-28
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **`--ui-mode auto` (the default) now requires the *classic* Flow arm for image
|
|
15
|
+
generation ([#595](https://github.com/ffroliva/gflow-cli/issues/595)).** `auto`
|
|
16
|
+
used to bind whatever the composer rendered, so an account that Flow moved into
|
|
17
|
+
its **agentic** cohort — observed live on two accounts on 2026-08-27 — took a
|
|
18
|
+
path that cannot satisfy an image request and failed with either
|
|
19
|
+
`image_mode_tab` selector drift (exit 23) or a `WireFormatError` about video
|
|
20
|
+
bytes. Neither error named the cause, and the workaround
|
|
21
|
+
(`GFLOW_CLI_PREFER_CLASSIC=1`) had to be discovered from an error message.
|
|
22
|
+
`auto` now means "no arm was asked for" and resolves to `classic`, matching the
|
|
23
|
+
rule video has followed since [#299](https://github.com/ffroliva/gflow-cli/issues/299).
|
|
24
|
+
The bind still attempts classic recovery first and the cohort flaps per page
|
|
25
|
+
load, so a run only aborts (`UiModeUnavailableError`, **exit 28**, pre-submit,
|
|
26
|
+
zero credits) when the arm is genuinely pinned — and that abort is retryable.
|
|
27
|
+
The agentic arm stays reachable, but only when asked for by name
|
|
28
|
+
(`--ui-mode agentic` / `GFLOW_CLI_UI_MODE=agentic`) or by need (`-i` agent
|
|
29
|
+
instructions, which are agentic-only and still force it). The image **batch**
|
|
30
|
+
path carried its own inline mode resolution and so kept binding `auto`; it now
|
|
31
|
+
routes through the same policy as the single-prompt path.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
|
|
35
|
+
- **An announcement modal that mounts *during* a batch generation no longer
|
|
36
|
+
silently changes the next prompt's settings**
|
|
37
|
+
([#593](https://github.com/ffroliva/gflow-cli/issues/593) follow-up). #593 left a
|
|
38
|
+
stated gap: call sites that neither route through `_probe_selector_cascade` nor
|
|
39
|
+
sit behind a navigation gate were still unguarded, and the set had not been
|
|
40
|
+
enumerated. Auditing all 73 click/fill/press sites in the UI transports found
|
|
41
|
+
exactly one that survives the "can a modal actually land here?" test — the image
|
|
42
|
+
**batch** loop's per-prompt boundary. A batch dismisses overlays once, during
|
|
43
|
+
setup; from prompt 2 on, the settings clicks are the first act after a
|
|
44
|
+
multi-second generation wait on a page that never navigates. This one is worse
|
|
45
|
+
than a timeout: `_open_gen_settings_panel` returns `False` when no selector
|
|
46
|
+
matches and the caller falls back to Flow's current defaults, so a modal that
|
|
47
|
+
mounted during prompt 1 did not fail prompt 2 — it generated it at the wrong
|
|
48
|
+
aspect/count. The boundary now runs the same `_require_unblocked` check the
|
|
49
|
+
navigation epochs use (one probe on the happy path), so the run aborts with
|
|
50
|
+
exit 23 and a screenshot instead of producing a quietly wrong image.
|
|
51
|
+
|
|
52
|
+
- **A Flow announcement modal no longer wedges a run with an unexplained timeout
|
|
53
|
+
([#593](https://github.com/ffroliva/gflow-cli/issues/593)).** When Google ships a
|
|
54
|
+
feature, Flow puts a full changelog dialog over the editor and sets
|
|
55
|
+
`body { pointer-events: none }` while leaving the app neither `aria-hidden` nor
|
|
56
|
+
`inert` — so every control reads visible and enabled yet never receives a click,
|
|
57
|
+
and Playwright's actionability wait runs to timeout with no message. Measured live
|
|
58
|
+
on two accounts (2026-08-27, pt and en), which is also how the four failure paths
|
|
59
|
+
below were found:
|
|
60
|
+
- The gallery "+ New project" sweep ran with **no overlay check at all** — the one
|
|
61
|
+
navigation epoch that had none. A modal there cost 18 selectors x Playwright's
|
|
62
|
+
30 s default click timeout and then reported `Could not find 'New project' CTA`,
|
|
63
|
+
which is the wrong error about the wrong thing. It now dismisses first and the
|
|
64
|
+
click carries an explicit 5 s timeout.
|
|
65
|
+
- Dismissal **verifies itself**. It previously returned success the moment a click
|
|
66
|
+
landed, so a dismissal that changed nothing still logged `overlay_dismissed` and
|
|
67
|
+
the run timed out somewhere unrelated — the success event lied. It now re-probes
|
|
68
|
+
and reports honestly, with a new `ui_automation.overlay_postmortem` warning.
|
|
69
|
+
- A persistent block now **aborts pre-submit at $0** with exit 23 and a screenshot
|
|
70
|
+
(probe `overlay_close_button`) instead of hanging. A transient is not enough to
|
|
71
|
+
trigger it: Flow's own menus set the same property while open, so the guard
|
|
72
|
+
re-probes after a settle.
|
|
73
|
+
- **The modal can mount *after* the navigation gate**, which is how it kept winning.
|
|
74
|
+
Flow hydrates on its own schedule, well past `domcontentloaded`, so dismissal at
|
|
75
|
+
the navigation boundary can run before the dialog exists — then the dialog appears
|
|
76
|
+
and covers a control that is present and enabled, and the selector cascade reports
|
|
77
|
+
drift for an element that is perfectly fine. A failed probe now checks the overlay
|
|
78
|
+
state before believing itself, and dismisses and re-probes once. The guard lives in
|
|
79
|
+
the one cascade every probe routes through, so all ten call sites are covered.
|
|
80
|
+
Verified live on a third account (2026-08-27): before the fix, `image_mode_tab`
|
|
81
|
+
raised `UiSelectorDriftError` with the announcement on screen and **no
|
|
82
|
+
`overlay_detected` in the log at all**; after it, the same command on the same
|
|
83
|
+
account cleared the modal (`setLastAcknowledgedChangeLogId` → 200, 23 s in, i.e.
|
|
84
|
+
from the probe guard rather than the navigation gate) and left the editor
|
|
85
|
+
reachable.
|
|
86
|
+
- The destructive Escape fallback is now **gated on the page actually being
|
|
87
|
+
blocked**, which retires the [#395](https://github.com/ffroliva/gflow-cli/issues/395)
|
|
88
|
+
hazard structurally rather than by comment. That regression pressed Escape on the
|
|
89
|
+
character composer and sent a generation out without `entityContext` — billed,
|
|
90
|
+
silently wrong. A page we can positively see is clickable is never touched.
|
|
91
|
+
|
|
92
|
+
Two raw-`goto` e2e tests (`test_sidebar_recovery_e2e`, `e2e_auth` — the nightly
|
|
93
|
+
canary's default tier — and `test_agentic_count_enforcement_e2e`) bypass every
|
|
94
|
+
transport boundary and were unprotected; both now dismiss explicitly, and both stop
|
|
95
|
+
hardcoding `"en"` in favour of the account's own locale (#587).
|
|
96
|
+
|
|
97
|
+
**One deliberate behaviour change.** The close-button cascade is now split: the
|
|
98
|
+
changelog-scoped anchor (`[role='dialog']:has(a[href*='changelog']) button`) runs on
|
|
99
|
+
any page because it cannot match one of Flow's own surfaces, while the generic
|
|
100
|
+
selectors (`button:has(i:text('close'))` and friends) and the Escape fallback run
|
|
101
|
+
only once the body is known to be blocked. The cost is that a non-modal banner —
|
|
102
|
+
one that covers a control without blocking the body — is no longer auto-closed by
|
|
103
|
+
the generic selectors. That is the right side of the trade: those same generic
|
|
104
|
+
selectors match the character composer's own close button, #395 spent real credits
|
|
105
|
+
through exactly that door, and `KNOWN_ISSUES` rates the banner case Low and
|
|
106
|
+
transient.
|
|
107
|
+
|
|
108
|
+
### Added
|
|
109
|
+
|
|
110
|
+
- **`gflow project list` / `project show` and the MCP `gflow_list_projects` tool now
|
|
111
|
+
emit an account-correct editor URL
|
|
112
|
+
([#587](https://github.com/ffroliva/gflow-cli/issues/587)).** They previously
|
|
113
|
+
emitted no URL at all: they are network-free catalog reads, so they had no way to
|
|
114
|
+
resolve a locale and correctly declined to guess one. With the locale now cached
|
|
115
|
+
per profile the link is readable offline. An unknown locale still yields the bare
|
|
116
|
+
URL — never a guessed `/fx/en/...`, which is the shape that started this thread by
|
|
117
|
+
being handed to a pt-BR account owner. In the terminal the project id renders as a
|
|
118
|
+
hyperlink, costing no column width.
|
|
119
|
+
|
|
120
|
+
### Changed
|
|
121
|
+
|
|
122
|
+
- **The account-locale probe no longer costs ~4 s on every command
|
|
123
|
+
([#587](https://github.com/ffroliva/gflow-cli/issues/587)).** The probe added in
|
|
124
|
+
v0.61.0 settles the bootstrap navigation to learn where Flow lands. On an account
|
|
125
|
+
Flow does *not* redirect there is nothing to settle, so `wait_for_url` ran to the
|
|
126
|
+
full `URL_SETTLE_TIMEOUT_MS` every single invocation. Measured live 2026-08-27,
|
|
127
|
+
best-of-N per arm: **~6.2 s -> ~2.0 s** setup on the non-redirecting account,
|
|
128
|
+
against an unchanged ~2.8 s -> ~2.9 s on a redirecting one (the control, which
|
|
129
|
+
shows the cold-then-warm ordering is worth nothing on its own). Run-to-run
|
|
130
|
+
variance is over a second, so read the delta as "the 4 s settle timeout", not to
|
|
131
|
+
two decimals.
|
|
132
|
+
The outcome is cached in the profile dir (`.gflow_locale`, a sibling of the
|
|
133
|
+
existing `.gflow_account`). The same guard covers all four `await_url_settled`
|
|
134
|
+
call sites **in the UI transport**; guarding only the editor entry left three
|
|
135
|
+
navigations still paying the timeout. (The three sites in the experimental REST
|
|
136
|
+
transports have no resolved locale to gate on and are unchanged.)
|
|
137
|
+
|
|
138
|
+
The cache decides only *whether to wait*, never *where to navigate*. Sending the
|
|
139
|
+
browser to a cached `/fx/{seg}/...` was built, measured, and rejected: Flow
|
|
140
|
+
serves whatever segment it is asked for, so a pt-BR account handed `/fx/de/`
|
|
141
|
+
stayed there and rendered `html lang=de` with no redirect — no correction signal,
|
|
142
|
+
and a wrong-language UI for as long as the stale value lived. That is #580's
|
|
143
|
+
defect in a new hat. The navigation therefore stays bare, which is what lets Flow
|
|
144
|
+
state the account's own answer. Reproducer: `scripts/dev/spike_locale_poison.py`.
|
|
145
|
+
|
|
146
|
+
The cache holds **four** states, and the fourth is what keeps it honest.
|
|
147
|
+
`await_url_settled` returns `None` for both "Flow does not redirect this account"
|
|
148
|
+
and "the settle timed out this once", so one slow network could otherwise commit
|
|
149
|
+
to "not redirected" permanently and silently restore #580's post-`goto` race. A
|
|
150
|
+
no-redirect observation is therefore **provisional** until a second run agrees;
|
|
151
|
+
a transient timeout costs one extra probe instead of a lasting defect.
|
|
152
|
+
|
|
153
|
+
### Fixed
|
|
154
|
+
|
|
155
|
+
- **A NULL `model` / `aspect` / `project_id` no longer reads back as the string
|
|
156
|
+
`"None"` in `gflow data list images|videos`.** All three columns are nullable in
|
|
157
|
+
the schema (`assets.model`, `assets.aspect_ratio`, `assets.flow_project_id`), but
|
|
158
|
+
both listing constructors wrapped them in a bare `str(...)`, so a NULL became the
|
|
159
|
+
four-character string `"None"` — emitted verbatim into `--json` and
|
|
160
|
+
indistinguishable from a real value. `_row_to_operation_error` in the same module
|
|
161
|
+
already guarded `model` correctly; the two listing paths never got the same
|
|
162
|
+
treatment. `ImageRow` / `VideoRow` now type these fields `str | None` and the JSON
|
|
163
|
+
output carries `null`.
|
|
164
|
+
|
|
10
165
|
## [0.61.0] — 2026-08-27
|
|
11
166
|
|
|
12
167
|
### Fixed
|
|
@@ -3247,7 +3402,8 @@ shell-script template that branches on these codes.
|
|
|
3247
3402
|
|
|
3248
3403
|
First skeleton. Not functional end-to-end yet.
|
|
3249
3404
|
|
|
3250
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
3405
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.62.0...HEAD
|
|
3406
|
+
[0.62.0]: https://github.com/ffroliva/gflow-cli/compare/v0.61.0...v0.62.0
|
|
3251
3407
|
[0.61.0]: https://github.com/ffroliva/gflow-cli/compare/v0.60.0...v0.61.0
|
|
3252
3408
|
[0.60.0]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...v0.60.0
|
|
3253
3409
|
[0.59.0]: https://github.com/ffroliva/gflow-cli/compare/v0.58.0...v0.59.0
|
|
@@ -503,6 +503,16 @@ playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded.
|
|
|
503
503
|
|
|
504
504
|
**Legacy workaround (no longer required):** open Flow in Chrome with the same profile once, click the `X` on the "What's new" popup, then close Chrome cleanly.
|
|
505
505
|
|
|
506
|
+
**Update 2026-08-27 ([#593](https://github.com/ffroliva/gflow-cli/issues/593)) — the modal wedges more than the first run.** Captured live on two accounts (pt and en): the announcement sets `body { pointer-events: none }` while leaving the app neither `aria-hidden` nor `inert`, so controls read visible **and enabled** yet never receive a click. That is why the symptom is a bare `TimeoutError` naming nothing rather than the "intercepts pointer events" message above. Three gaps were closed:
|
|
507
|
+
|
|
508
|
+
- The gallery "+ New project" sweep had no overlay check at all, so a modal there burned 18 selectors x Playwright's 30 s default click timeout before reporting the wrong error.
|
|
509
|
+
- Dismissal reported success on click without verifying anything cleared — `overlay_dismissed` was logged on runs that then timed out elsewhere.
|
|
510
|
+
- The Escape fallback is now gated on the page being provably blocked, which retires the [#395](https://github.com/ffroliva/gflow-cli/issues/395) hazard structurally.
|
|
511
|
+
|
|
512
|
+
A block that survives dismissal now aborts pre-submit with exit 23 (probe `overlay_close_button`) and a screenshot, at zero credits, instead of hanging. Dismissal persists server-side — Flow records it as `videoFx.setLastAcknowledgedChangeLogId`, so one dismissal per announcement per account is the whole cost.
|
|
513
|
+
|
|
514
|
+
**Follow-up 2026-08-28 — the one remaining epoch, found by audit.** #593 left a stated gap: call sites that neither route through `_probe_selector_cascade` nor sit behind a navigation gate. All 73 click/fill/press sites in the UI transports were then enumerated and classified, and exactly one survives the "can a modal actually land here?" test: the **image batch** loop's per-prompt boundary. A batch dismisses overlays once during setup, so from prompt 2 on the settings clicks are the first act after a multi-second generation wait on a page that never navigates. That one failed *silently* rather than loudly — `_open_gen_settings_panel` returns `False` when nothing matches and the caller falls back to Flow's current defaults, so a modal that mounted during prompt 1 generated prompt 2 at the wrong aspect/count. It now runs the same `_require_unblocked` check the navigation epochs use. Every other unguarded site fails loudly (exit 23 with a probe name and a screenshot, or an `overlay_postmortem` warning), which is why they are deliberately left unguarded rather than pre-guarded on a hunch.
|
|
515
|
+
|
|
506
516
|
---
|
|
507
517
|
|
|
508
518
|
### No in-CLI quota visibility
|
|
@@ -901,6 +911,15 @@ names the pinning case. Retrying *immediately* during a pin is futile — wait a
|
|
|
901
911
|
while or switch `--profile`. Recorded as the #299 PR-B predict-gate evidence:
|
|
902
912
|
retry loops must never key off the pinned signature.
|
|
903
913
|
|
|
914
|
+
**Update 2026-08-28 ([#595](https://github.com/ffroliva/gflow-cli/issues/595)) — images
|
|
915
|
+
now reach this fail-fast by default.** Two accounts flipped agentic on 2026-08-27 and a
|
|
916
|
+
plain `gflow image t2i` failed on both, because `auto` bound whatever rendered and the
|
|
917
|
+
agentic driver cannot satisfy an image request (either `image_mode_tab` selector drift or
|
|
918
|
+
a `WireFormatError` about video bytes — neither naming the cause). `auto` now resolves to
|
|
919
|
+
`classic` for images too, so a pinned account gets the exit-28 abort described above
|
|
920
|
+
instead of a mid-run failure, and `GFLOW_CLI_PREFER_CLASSIC=1` is no longer the
|
|
921
|
+
workaround anyone needs to discover.
|
|
922
|
+
|
|
904
923
|
### Auth verification depends on Google's NextAuth session endpoint
|
|
905
924
|
|
|
906
925
|
- **Status:** Mitigated · **Severity:** Low (degrades fail-closed) · **Affects:** issue #15 fix onward · **Tracked:** issue #15
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.62.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
|
|
@@ -345,7 +345,7 @@ GFLOW_CLI_HISTORY_PROMPTS=redacted gflow image t2i "confidential brief"
|
|
|
345
345
|
|
|
346
346
|
**What:** Which Flow UI arm to use for generation. Flow serves a **classic** composer (hard crop/aspect controls) or an **agentic** chat cohort, server-assigned and flapping per page load ([#299](https://github.com/ffroliva/gflow-cli/issues/299)).
|
|
347
347
|
**Values:**
|
|
348
|
-
- `auto` (default) —
|
|
348
|
+
- `auto` (default) — no arm was asked for, so gflow **requires `classic`** ([#595](https://github.com/ffroliva/gflow-cli/issues/595)): classic is the arm that can satisfy a generation request, and it is recovered first, so this only aborts when the arm is genuinely pinned. Before v0.62.0 `auto` bound whatever rendered, which put an account in Flow's agentic cohort on a driver that cannot produce an image — failing mid-run as `image_mode_tab` selector drift or a `WireFormatError` about video bytes. Agentic is still reachable, but only by name (`--ui-mode agentic`) or by need (`-i`).
|
|
349
349
|
- `classic` — require the classic composer (hard aspect controls). gflow switches to it, re-probes to verify, and if the arm is still agentic **aborts before submitting** with `UiModeUnavailableError` (**exit 28**) — no credits spent.
|
|
350
350
|
- `agentic` — require the agentic chat surface (needed for `-i` agent instructions). gflow switches to it, verifies, and aborts (exit 28) if it can't be reached.
|
|
351
351
|
**Default:** `auto`
|
|
@@ -145,12 +145,12 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
145
145
|
**"Two gflow runs on the same profile — can the second one wait instead of failing (exit 11)?"** → [CONFIGURATION § GFLOW_CLI_LEASE_WAIT_SECONDS](CONFIGURATION.md#gflow_cli_lease_wait_seconds) (v0.56.0 opt-in bounded wait)
|
|
146
146
|
**"How do I silence the 'newer version on PyPI' stderr notice?"** → [CONFIGURATION § GFLOW_CLI_UPDATE_CHECK](CONFIGURATION.md#gflow_cli_update_check) (`0` disables; auto-skipped in CI and for editable installs)
|
|
147
147
|
**"How do I run the MCP server so an agent can't spend credits?"** → [CONFIGURATION § GFLOW_MCP_NO_SPEND](CONFIGURATION.md#gflow_mcp_no_spend) + [MCP § Option A2](MCP.md#option-a2-read-only-server) (`gflow mcp run --no-spend` / `GFLOW_MCP_NO_SPEND=1`; v0.57.0 — both generate tools go unregistered, not merely refused)
|
|
148
|
-
**"Which Flow UI arm does a
|
|
148
|
+
**"Which Flow UI arm does a run require, and why did it exit 2 or 28?"** → [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode) (`auto` ≡ `classic` for **both** images and video — video since v0.57.0/#299, images since #595; unreachable classic aborts pre-submit with exit 28, $0; explicit `agentic` on video exits 2)
|
|
149
149
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
150
150
|
**"A command failed — where is the incident bundle and what's in it?"** → [DEBUGGING § Automatic incident bundles](DEBUGGING.md#automatic-incident-bundles) (layout, triggers, review-before-sharing); privacy boundaries: [SECURITY § Automatic incident bundles](SECURITY.md#automatic-incident-bundles-gflow_cli_incident_capture-default-on); disable via [CONFIGURATION § GFLOW_CLI_INCIDENT_CAPTURE](CONFIGURATION.md#gflow_cli_incident_capture)
|
|
151
151
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
152
152
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
153
|
-
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
|
|
153
|
+
**What was actually live-verified for the latest release?** → latest: [LIVE_VERIFICATION_v0.62.0](LIVE_VERIFICATION_v0.62.0.md) (**#595 `auto` ≡ `classic` for images, verified 2026-08-28 on profile `ci-probe` — an account Flow had moved to the agentic cohort the day before — at ZERO Veo credits.** With no flags and no env vars the run logged `ui_driver.ui_mode.attempt_exit_agent` → `ui_driver.bound mode=classic ui_mode=classic` and generated a real 768x1376 JPEG (exit 0); the day before, the identical command on the same account bound `auto`→`agentic` and failed. The same log independently closed **#183**: `mode_switch_trigger` and `image_mode_tab`, the selectors it reported as unfindable, both matched. #591 was proven against the real 500-row catalog — **0** occurrences of the string `"None"`, 31 proper JSON `null`s, over a catalog holding 119 NULL-bearing rows. #592 shows exactly one `client.account_locale_cached` per command. Three items are recorded as NOT verified rather than omitted: the exit-28 abort on a *pinned* agentic account, the #597 batch inter-prompt guard, and any fresh announcement modal — the last two because all three accounts have already acked the current changelog, so no modal can be raised until Google ships the next one.) · previous: [LIVE_VERIFICATION_v0.61.0](LIVE_VERIFICATION_v0.61.0.md) (**#539 video-model refusal + #586 image-model refusal and server-side attribution, verified 2026-08-26/27 on profile `denon82`, ONE Veo generation total** — the video fix was proven by a **zero-credit A/B against the stashed pre-fix source running on live Flow**: the old code returned SELECTED for `veo-lite-lp`, a model Flow does not offer to this account, and for a deliberately ambiguous selector matching 3 entries; the new code refuses both with exit 18 naming what Flow offered. Model selection happens before submit, so refusals cost nothing and the A/B was free. The happy path still generates: `--model omni-flash` → exit 0, a real 2.2 MB `ftypisom` mp4, catalog recording `omni_flash`. Two items are recorded as NOT verified rather than omitted: three of #584's four navigation-settle sites were never exercised [no bearer refresh occurred in these runs], and #582's canary self-re-exec has its first real exercise tonight. Also falsified: #539's recorded note that the video picker uses a different trigger — the two constants are byte-identical strings, and the repeated empty menu captures were the capture's own fault.) · previous: [LIVE_VERIFICATION_v0.60.0](LIVE_VERIFICATION_v0.60.0.md)
|
|
154
154
|
**"Was the playwright upper bound raised, and on what evidence?"** → [LIVE_VERIFICATION_playwright_1.61](LIVE_VERIFICATION_playwright_1.61.md) (**`>=1.59.0,<1.60.0` → `>=1.61.0,<1.62.0` verified 2026-08-05, 1 Imagen + 1 Veo credit** — the 2026-08-03 regression that motivated the bound does NOT reproduce on 1.61.0: a live `i2v` drove the full chain with `image_uploaded status=200` → `frame_attached` → `generate_captured status=200` with `startImage` parsed, where **1.62.0 hung silently at exactly that upload step**; live `i2i` local-ref attach passed outright [96.7s]. **1.62.0 stays excluded** — never root-caused. Also found, A/B-proven pre-existing on BOTH 1.59.0 and 1.61.0: Flow dropped the duration-tab UI, so **`--duration` is currently broken for i2v** — `UiSelectorDriftError` fires correctly [refusing rather than silently accepting Flow's default, #288] but the selector needs re-deriving; that is why the i2v proof was driven via the CLI without `--duration`, and Flow's own server-side `PUBLIC_ERROR_VIDEO_GENERATION_TIMED_OUT` means no finished mp4 is claimed).
|
|
155
155
|
**"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. Pre-capture research recons: [ASSET_TAGGING_RECON](ASSET_TAGGING_RECON.md) (`@`-mention asset tagging — shipped in v0.40.0, see [LIVE_VERIFICATION_v0.40.0](LIVE_VERIFICATION_v0.40.0.md)).
|
|
156
156
|
**"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)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Live verification — v0.62.0
|
|
2
|
+
|
|
3
|
+
Every claim below was **observed**. Claims that could not be observed are stated
|
|
4
|
+
as such in §6, not omitted.
|
|
5
|
+
|
|
6
|
+
## Environment
|
|
7
|
+
|
|
8
|
+
| | |
|
|
9
|
+
|---|---|
|
|
10
|
+
| Date | 2026-08-28 |
|
|
11
|
+
| Profile | `ci-probe` (one of the two accounts Flow moved to the **agentic** cohort on 2026-08-27) |
|
|
12
|
+
| Code under test | `develop` @ `fb8b346` (all five release commits merged; the version bump itself came after, so log lines read `cli_version 0.61.0`) |
|
|
13
|
+
| Veo credits spent | **0** — this release's user-facing changes are image-path and read-only surfaces |
|
|
14
|
+
|
|
15
|
+
## 1. #595 — `--ui-mode auto` requires the classic arm (the headline change)
|
|
16
|
+
|
|
17
|
+
The whole point of the fix is what happens with **no flags and no env vars**, which
|
|
18
|
+
is what a new user gets:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
gflow --verbose image t2i "a single red cube on a white studio table, soft light" --profile ci-probe
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The decisive pair of events:
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{"event": "ui_driver.ui_mode.attempt_exit_agent"}
|
|
28
|
+
{"mode": "classic", "ui_mode": "classic", "event": "ui_driver.bound"}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`ui_mode` is **`classic`** with nothing on the command line. The day before, the same
|
|
32
|
+
command on this same account logged `ui_mode=auto` → `mode=agentic` and failed.
|
|
33
|
+
|
|
34
|
+
Five-layer ledger for the generation that followed:
|
|
35
|
+
|
|
36
|
+
| Layer | Observed |
|
|
37
|
+
|---|---|
|
|
38
|
+
| File count | 1 file in `~/Downloads/gflow-cli/images/2026-08-28/` |
|
|
39
|
+
| Magic bytes | `ff d8 ff e0` + `JFIF` at offset 6 — a real JPEG, not an HTML error page |
|
|
40
|
+
| Size / dimensions | 418 079 bytes, **768x1376** (the requested portrait 9:16) |
|
|
41
|
+
| Structlog invariants | `mode_switch_trigger` matched → `image_mode_tab` matched → `image_mode_entered` → `image_model_selected NARWHAL` → `aspect_ratio_set 9:16` → `count_setter_completed 1` → `prompt_submitted` → `batch_response_captured status=200` |
|
|
42
|
+
| User-confirmable artifact | `f0f5ef51-6a45-4c0c-a146-103f18ce9fba_1.jpg`, seed 294067, exit **0** |
|
|
43
|
+
|
|
44
|
+
`mode_switch_trigger` and `image_mode_tab` both matching is independently the
|
|
45
|
+
evidence that closed **#183**, which reported those exact selectors as unfindable.
|
|
46
|
+
|
|
47
|
+
## 2. #591 — a NULL column no longer reads back as the string `"None"`
|
|
48
|
+
|
|
49
|
+
Run against the **real catalog** (not a fixture), 500 rows:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
gflow data list images --limit 500 --json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
| | count |
|
|
56
|
+
|---|---|
|
|
57
|
+
| rows returned | 500 |
|
|
58
|
+
| occurrences of the literal string `"None"` | **0** |
|
|
59
|
+
| occurrences of JSON `null` | 31 |
|
|
60
|
+
|
|
61
|
+
The catalog holds 119 image rows with a NULL in `model` / `aspect_ratio` /
|
|
62
|
+
`flow_project_id`, so the null path is genuinely exercised: before the fix those
|
|
63
|
+
rows emitted the four-character string `"None"`, indistinguishable from a real value.
|
|
64
|
+
|
|
65
|
+
## 3. #592 — the account-locale probe runs once per profile
|
|
66
|
+
|
|
67
|
+
From the same run's log:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{"locale": null, "settle_skipped": true, "event": "client.account_locale_cached"}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Exactly **one** `client.account_locale_cached` event for the whole command, and both
|
|
74
|
+
navigation settles report `settle_skipped: true` — the per-command ~4 s probe is gone.
|
|
75
|
+
|
|
76
|
+
## 4. `gflow project list` / `project show` (the release's new feature)
|
|
77
|
+
|
|
78
|
+
Both are read-only and credit-free. `project list --limit 3` returned the project
|
|
79
|
+
created by §1 with a correct rollup (`IMG 1`, `VID 0`), and `project show` on that id
|
|
80
|
+
returned title, profile, source `generated`, creation timestamp, and a working Flow URL:
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
Project ID: fdb68253-21a5-4d99-a5f5-091aa2a1de17
|
|
84
|
+
Title: a-single-red-cube-on-a-white-studio-tabl
|
|
85
|
+
Profile: ci-probe
|
|
86
|
+
Source: generated
|
|
87
|
+
URL: https://labs.google/fx/tools/flow/project/fdb68253-21a5-4d99-a5f5-091aa2a1de17
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Cross-checked against §1: the id, the profile and the image count all agree with the
|
|
91
|
+
generation that produced them.
|
|
92
|
+
|
|
93
|
+
## 5. #593 — the announcement-modal fix
|
|
94
|
+
|
|
95
|
+
Verified live in the previous cycle (2026-08-27, recorded on PR #594): the ack POST
|
|
96
|
+
`videoFx.setLastAcknowledgedChangeLogId` → 200 fired at **+23 s**, well after the
|
|
97
|
+
~3 s navigation gate, which is the attribution proving the probe-level guard — not the
|
|
98
|
+
boundary dismissal — cleared it. In **this** release's runs the overlay path is
|
|
99
|
+
silent (`0` overlay events in the §1 log), which is the correct outcome: all three
|
|
100
|
+
accounts have already acknowledged the current announcement.
|
|
101
|
+
|
|
102
|
+
## 6. NOT verified this cycle — stated, not omitted
|
|
103
|
+
|
|
104
|
+
- **The exit-28 abort on a genuinely pinned agentic account (#595).** `ci-probe`
|
|
105
|
+
rendered classic on this load. The cohort is server-assigned and flaps, so a pin
|
|
106
|
+
cannot be provoked on demand. The abort path is the same `get_ui_driver` code #299
|
|
107
|
+
shipped for video and is covered offline, but it has not been observed live for
|
|
108
|
+
images.
|
|
109
|
+
- **The #597 batch inter-prompt guard.** Reproducing it needs an announcement modal
|
|
110
|
+
to mount *during* a multi-prompt batch generation. All three accounts have acked
|
|
111
|
+
the current announcement, so no modal can be raised at all until Google ships the
|
|
112
|
+
next one. Covered offline against the captured markup
|
|
113
|
+
(`tests/fixtures/changelog_modal_page.html`, real headless Chromium) plus mocks.
|
|
114
|
+
- **A fresh announcement modal end-to-end.** Same reason: nothing to dismiss until
|
|
115
|
+
Google ships the next changelog.
|
|
@@ -82,7 +82,7 @@ Both Click CLI (`src/gflow_cli/cli.py`) and MCP Server (`src/gflow_cli/mcp/`) ar
|
|
|
82
82
|
The server registers three protocol surfaces:
|
|
83
83
|
|
|
84
84
|
### Tools (Executable actions)
|
|
85
|
-
* `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile, project, project_name, instructions, ui_mode, output, wait)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `instructions` is an optional list of ephemeral agent-instruction strings (agentic cohort only). `reference_images` switches to i2i and accepts **either a local file path or a generated image's Flow media UUID**. A UUID reference is attached by **selecting the already-existing asset in Flow's reference picker — no duplicate copy is uploaded** (locating the tile by the media id in its thumbnail URL, and searching the recorded display name to surface it when needed); gflow falls back to uploading the asset's on-disk local file only when it can't be located in place (e.g. it lives in a different project's picker). `project` generates into an existing Flow project id (mirrors CLI `--project`) — pass the reference's project to keep it selectable in place. `ui_mode` selects the Flow UI arm (`auto`/`classic`/`agentic`, mirroring CLI `--ui-mode`, matched case-insensitively);
|
|
85
|
+
* `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile, project, project_name, instructions, ui_mode, output, wait)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `instructions` is an optional list of ephemeral agent-instruction strings (agentic cohort only). `reference_images` switches to i2i and accepts **either a local file path or a generated image's Flow media UUID**. A UUID reference is attached by **selecting the already-existing asset in Flow's reference picker — no duplicate copy is uploaded** (locating the tile by the media id in its thumbnail URL, and searching the recorded display name to surface it when needed); gflow falls back to uploading the asset's on-disk local file only when it can't be located in place (e.g. it lives in a different project's picker). `project` generates into an existing Flow project id (mirrors CLI `--project`) — pass the reference's project to keep it selectable in place. `ui_mode` selects the Flow UI arm (`auto`/`classic`/`agentic`, mirroring CLI `--ui-mode`, matched case-insensitively). Since [#595](https://github.com/ffroliva/gflow-cli/issues/595) `auto` means "no arm was asked for" and **resolves to `classic`** — the arm that can satisfy an image request — so an account in Flow's agentic cohort aborts pre-submit (exit-28 equivalent envelope, zero credits) instead of failing mid-run with selector drift or video bytes; the agentic arm is bound only when named. Passing `instructions` forces `agentic` automatically, so `ui_mode="classic"` + `instructions` is a hard conflict rather than a silent drop. An unknown value returns a 400 problem-details envelope. See [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode).
|
|
86
86
|
* `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, model, duration, count, tools, profile, project, project_name, ui_mode, output, wait)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `model` (`veo_lite`/`veo_fast`/`veo_quality`/`omni_flash`, aliases accepted), `duration` (seconds), and `count` mirror the CLI `gflow video` flags — an omitted `model` lets the transport apply its i2v veo-lite default (issue #125), and `omni_flash` is rejected for i2v-with-frames; `i2v` requires `initial_frame`, `r2v` requires `reference_images`; `project` generates into an existing Flow project id (mirrors CLI `--project`). `initial_frame`, `end_frame`, and `reference_images` each accept **either a local file path or the Flow image UUID of a generated asset** — pass a generated image's id straight in to chain image→video, and gflow attaches it for you. Since v0.58.0 (#529) the CLI and MCP surfaces are unified for i2v frames: the UUID keeps its identity and is enriched with the catalog's recorded display name plus an integrity-verified local fallback, so the transport prefers **selecting the exact asset in the project's media picker** (no duplicate upload) and re-uploads the recorded local file only when the tile is unreachable — and only if its byte count/SHA-256 still match. A UUID that isn't in your local asset catalog is rejected up front with a clear "Reference Not Found" error; a catalogued asset with neither a display name nor a verified local file gives a "Reference Not Usable" error (re-generate it or pass a local path). `r2v` UUID refs are resolved to the recorded local file for upload. `ui_mode` selects the Flow UI arm (#299 PR-A, mirroring CLI `--ui-mode`) and **applies to every mode of this tool, including `r2v`** — unlike the CLI, where `video r2v`/`chain` have no flag and follow the env-only path. Video generation has **only a classic driver**, so `auto` ≡ `classic`: both verify the classic editor pre-submit and abort before spending credits if it is unreachable. `ui_mode="agentic"` is rejected with a 400 problem-details envelope, because no agentic video driver exists yet. Values are matched case-insensitively. (MCP tools return envelopes, never process exit codes — the CLI equivalents of these aborts are exit 28 and exit 2 respectively.) See [CONFIGURATION § GFLOW_CLI_UI_MODE](CONFIGURATION.md#gflow_cli_ui_mode).
|
|
87
87
|
* `gflow_auth_status(profile)`: Credit-free, non-interactive Flow session probe (#497) — wraps the same fail-closed `verify_flow_profile` check as `gflow auth status`. Returns `{"status": "authenticated", "profile", "user_email"}` or a problem-details error with a `remediation_hint`; a `verification_error` outcome means a network/endpoint problem, which re-login does not fix. Call it before a generation tool to fail fast on dead auth (the queue is async — without it, an auth failure surfaces only later from the daemon). Login/logout remain CLI-only (genuinely interactive).
|
|
88
88
|
* `gflow_list_projects(profile, limit, offset)`: Queries the SQLite catalog for recent generation folders, paginated — the response carries `count` (rows in this page), `offset`, `has_more`, and `next_offset` (pass it back as `offset` for the next page; `null` on the last page).
|
|
@@ -196,7 +196,9 @@ Options:
|
|
|
196
196
|
--ui-mode [auto|classic|agentic]
|
|
197
197
|
Require a Flow UI arm: classic (hard aspect
|
|
198
198
|
controls) / agentic (chat surface; forced by -i) /
|
|
199
|
-
auto (default)
|
|
199
|
+
auto (default) — auto resolves to classic, the only
|
|
200
|
+
arm that can satisfy an image request (#595).
|
|
201
|
+
Aborts exit 28 if unreachable.
|
|
200
202
|
Single-prompt only; batch uses GFLOW_CLI_UI_MODE.
|
|
201
203
|
--profile NAME Profile name (overrides default).
|
|
202
204
|
```
|
|
@@ -1508,7 +1510,7 @@ shell scripts can branch on the failure mode without parsing stderr.
|
|
|
1508
1510
|
| `20` | `FrameExtractionError` | Could not extract the last frame for a video chain link | Check the source video downloaded intact; retry the link |
|
|
1509
1511
|
| `21` | `ChainPartialError` | A video chain stopped mid-way; earlier links completed | Resume from the last completed link shown in the error |
|
|
1510
1512
|
| `22` | `UpscaleUnavailableError` | 4K upscale is gated to Flow **Ultra** accounts (HTTP 403) | Use `--scale 2k`, or upgrade the Flow plan |
|
|
1511
|
-
| `23` | `UiSelectorDriftError` | A Flow editor control could not be located — Google changed the frontend (issues #183, #493) | Update gflow-cli; file a bug with the probe name + the diagnostics JSON / debug screenshot referenced in the error message, plus the incident bundle's `report.md` when one was written |
|
|
1513
|
+
| `23` | `UiSelectorDriftError` | A Flow editor control could not be located — Google changed the frontend (issues #183, #493) — **or** a blocking announcement overlay survived dismissal, so no control below it can be clicked (probe `overlay_close_button`, #593) | Update gflow-cli; file a bug with the probe name + the diagnostics JSON / debug screenshot referenced in the error message, plus the incident bundle's `report.md` when one was written. For `overlay_close_button`: open the project once in Chrome and dismiss the announcement — the dismissal persists on your account |
|
|
1512
1514
|
| `24` | `BrowserEngineUnavailableError` | `GFLOW_CLI_BROWSER_ENGINE=patchright` but the engine is not installed | `pip install 'gflow-cli[patchright]'`, or unset `GFLOW_CLI_BROWSER_ENGINE` |
|
|
1513
1515
|
| `25` | `FlowAgentUiError` | The profile is on Flow's Agentic UI cohort and the classic media panel is unrecoverable for this operation | Rare since v0.38.0 (#332): the mode controller reliably recovers agentic→classic, so first retry with `--ui-mode classic`; if it persists, see KNOWN_ISSUES on the agentic cohort |
|
|
1514
1516
|
| `26` | `MediaAttributionError` | Generated media could not be reliably attributed to this request (issue #281) | Re-run; a dedicated project with fewer pre-existing assets avoids the ambiguity |
|
{gflow_cli-0.61.0 → gflow_cli-0.62.0}/docs/superpowers/specs/2026-08-21-selector-registry-design.md
RENAMED
|
@@ -102,6 +102,16 @@ established, not merely plausible.**
|
|
|
102
102
|
|
|
103
103
|
### 2.4 Locale is account-driven
|
|
104
104
|
|
|
105
|
+
> **Superseded 2026-08-27 (#587).** The sentence below — *"Passing `locale="en"` to
|
|
106
|
+
> `project_editor_url()` still served `/fx/pt/` in Portuguese"* — is the **inverse** of
|
|
107
|
+
> what `scripts/dev/spike_locale_poison.py` measures: Flow serves whatever segment it
|
|
108
|
+
> is asked for and never corrects a wrong-but-valid one. The original observation was
|
|
109
|
+
> almost certainly the ineffective launch-context `locale="en-US"` noted in the
|
|
110
|
+
> corollary below — a Chrome kwarg, never a URL segment — rather than the URL
|
|
111
|
+
> builder, which does reduce `en-US` to `/fx/en/`. §2.4's *conclusion* (account-driven) stands on the
|
|
112
|
+
> authed/unauthed contrast; the mechanism sentence does not. Do not use it to argue
|
|
113
|
+
> that navigating to a cached segment is safe — that design was built and rejected.
|
|
114
|
+
|
|
105
115
|
Passing `locale="en"` to `project_editor_url()` still served `/fx/pt/` in Portuguese.
|
|
106
116
|
The *evidence* for account-attribution is the authed/unauthed contrast at identical
|
|
107
117
|
`Accept-Language` and IP: **authed → `pt`, unauthed → `en`, cookie the only variable**
|