gflow-cli 0.16.0__tar.gz → 0.18.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.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/check.md +7 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/release.md +19 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.gitignore +3 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/AGENTS.md +1 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CHANGELOG.md +36 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CLAUDE.md +1 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/KNOWN_ISSUES.md +44 -2
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/PKG-INFO +2 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/RELEASE.md +25 -10
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/AUTHENTICATION.md +21 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/INDEX.md +3 -1
- gflow_cli-0.18.0/docs/LIVE_VERIFICATION_v0.16.0.md +77 -0
- gflow_cli-0.18.0/docs/LIVE_VERIFICATION_v0.17.0.md +94 -0
- gflow_cli-0.18.0/docs/LIVE_VERIFICATION_v0.18.0.md +72 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/PROJECT_STATUS.md +7 -2
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/USAGE.md +6 -0
- gflow_cli-0.18.0/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +186 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/pyproject.toml +2 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/ci/check_repo_hygiene.py +52 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/active_plan.py +7 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_issue170_picker_locale_recon.py +2 -2
- gflow_cli-0.18.0/scripts/dev/spike_issue174_library_ui_recon.py +445 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/scenario/SKILL.md +7 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/ui_automation.py +18 -5
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/ui_automation_video.py +48 -8
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/__init__.py +8 -9
- gflow_cli-0.18.0/src/gflow_cli/auth/cookies.py +159 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/real_chrome.py +24 -3
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/verification.py +108 -8
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_image.py +4 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/errors.py +31 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/exceptions.py +1 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/paths.py +11 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation.py +13 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation_image_mode.py +24 -2
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation_video.py +31 -3
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/auth/strategies/test_strategies.py +44 -3
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/auth/test_verification.py +276 -0
- gflow_cli-0.18.0/tests/cli/test_cli_image_selector_drift.py +74 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/conftest.py +10 -4
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_auth_verification_e2e.py +33 -8
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/locale_picker_include.feature +1 -1
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_locale_picker_include_steps.py +11 -4
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_check_repo_hygiene.py +45 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_errors.py +37 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/uv.lock +129 -1
- gflow_cli-0.16.0/.continue-here.md +0 -118
- gflow_cli-0.16.0/PR162_MOVIE_CHARACTER_REVIEW.md +0 -137
- gflow_cli-0.16.0/docs/superpowers/2026-05-17-issue-15-handover.md +0 -59
- gflow_cli-0.16.0/docs/superpowers/character-scenario.md +0 -140
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-01-governance-enforcement-advisory/PLAN.md +0 -271
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-04-character-create-recording.md +0 -428
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-06-movie-p0-asyncio-hotfix.md +0 -223
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-06-movie-p1-composition-manifest.md +0 -1208
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-06-movie-p2-native-identity-voice.md +0 -612
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-image-upscale/PLAN.md +0 -206
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-image-upscale/SCENARIO.md +0 -79
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-issue-170-locale-selectors/PLAN.md +0 -218
- gflow_cli-0.16.0/docs/superpowers/plans/2026-06-11-issue-170-locale-selectors/SCENARIO.md +0 -101
- gflow_cli-0.16.0/docs/superpowers/specs/2026-06-06-movie-consistency-design.md +0 -310
- gflow_cli-0.16.0/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -123
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.env.template +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.gitattributes +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/.secrets.baseline +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/GEMINI.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/LICENSE +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/PLAN.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/ROADMAP.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/conftest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docker-compose.yml +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/llms.txt +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/record_flow_capture.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/README.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/sonar-project.properties +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/client.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/conftest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/dev/test_record_flow_capture.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_config.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_media.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.16.0 → gflow_cli-0.18.0}/tests/test_smoke.py +0 -0
|
@@ -50,3 +50,10 @@ If the coverage run crashes the current MCP/sandbox session with `Connection clo
|
|
|
50
50
|
same marker-filtered suite in smaller chunks without coverage and rely on CI for the coverage XML.
|
|
51
51
|
Project pytest defaults already exclude `e2e` and `live`; those markers are explicit,
|
|
52
52
|
credit-spending gates and must be requested with a separate `-m e2e` / `-m live` command.
|
|
53
|
+
|
|
54
|
+
**Windows agent sessions:** `uv run pytest` is unreliable — invoke
|
|
55
|
+
`.venv/Scripts/python.exe -m pytest` directly, and prefix Python invocations with
|
|
56
|
+
`PYTHONUTF8=1` when output contains non-ASCII. The unscoped full-coverage sweep
|
|
57
|
+
(step 4) can OOM locally (exit 137 / SIGKILL): run the suites scoped to the dirs you
|
|
58
|
+
touched and trust CI for the full coverage gate — **a green full-suite CI run on the
|
|
59
|
+
same tree (e.g. the just-merged PR) satisfies step 4 for release purposes.**
|
|
@@ -70,6 +70,19 @@ memory) or the release branch will hit conflicts on `pyproject.toml` / `__init__
|
|
|
70
70
|
|
|
71
71
|
Run `/gflow:check` — all gates must pass. Abort if any fail.
|
|
72
72
|
|
|
73
|
+
**4b. Live-verify the release's user-facing features (REQUIRED gate).**
|
|
74
|
+
|
|
75
|
+
For every new/changed user-facing feature in this release, exercise it against
|
|
76
|
+
live Flow (credit-free wherever possible — image gen, entity attach, upscale, and
|
|
77
|
+
scene/timeline ops cost no Veo credits) and write the evidence to
|
|
78
|
+
`docs/LIVE_VERIFICATION_v<NEW_VERSION>.md` using the 5-layer ledger (file count +
|
|
79
|
+
magic bytes + dimensions/shape + structlog invariants + a user-confirmable
|
|
80
|
+
artifact). Add it to the "what was live-verified" entry in `docs/INDEX.md`. This
|
|
81
|
+
doc shipped for every release v0.7.0→v0.13.0, then lapsed for v0.14.0–v0.15.1 —
|
|
82
|
+
which is why it is now an explicit gate. If a feature genuinely cannot be verified
|
|
83
|
+
this cycle, record that and the reason in the doc; never silently omit it. Stage
|
|
84
|
+
the doc into the release-prep commit (step 11).
|
|
85
|
+
|
|
73
86
|
**5. Create a release branch off `develop`.**
|
|
74
87
|
|
|
75
88
|
```bash
|
|
@@ -116,6 +129,12 @@ rg -n "__version__|<OLD_VERSION>|version assertion" tests src pyproject.toml
|
|
|
116
129
|
|
|
117
130
|
Run `/gflow:doc-review` — audit all version refs, INDEX completeness, evidence files, skill files, CHANGELOG footer, and memory files. Fix every **FAIL** before continuing. Fold all discovered fixes into the release prep commit.
|
|
118
131
|
|
|
132
|
+
Also **consolidate shipped planning artifacts** here: extract any durable patterns
|
|
133
|
+
into auto-memory, then remove the now-shipped `docs/superpowers/` plan / spec /
|
|
134
|
+
verification files (keep only in-flight work). `check_repo_hygiene.py` enforces the
|
|
135
|
+
root-doc allowlist, so a stray review doc or session marker left at the repo root
|
|
136
|
+
will fail the gate.
|
|
137
|
+
|
|
119
138
|
**11. Commit the release prep.**
|
|
120
139
|
|
|
121
140
|
```bash
|
|
@@ -66,6 +66,9 @@ 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
|
+
# Agent session marker — machine/session-local handoff state, regenerated per run
|
|
70
|
+
.continue-here.md
|
|
71
|
+
|
|
69
72
|
# Live Flow traffic captures — NEVER commit (contain real Bearer tokens / API keys).
|
|
70
73
|
# Diagnostic scripts MUST default-write here, NOT to samples/captured/.
|
|
71
74
|
# Sanitised reference samples (no secrets) can still live under samples/captured/.
|
|
@@ -56,7 +56,7 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
56
56
|
|
|
57
57
|
- Type hints everywhere; `pyright` strict on `src/gflow_cli`.
|
|
58
58
|
- Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
|
|
59
|
-
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–
|
|
59
|
+
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
|
|
60
60
|
- 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
|
|
61
61
|
|
|
62
62
|
## PR instructions
|
|
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.18.0] — 2026-06-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- `UiSelectorDriftError` (exit code 23): UI-automation selector-probe failures — e.g. the
|
|
15
|
+
mode-switch `crop_*` trigger missing from the Flow editor (issue #183) — now raise a typed
|
|
16
|
+
error carrying the probe name, the debug-screenshot path, and a remediation hint, instead
|
|
17
|
+
of an opaque "Unexpected error" (exit 1) whose message was hashed away in logs. Converted
|
|
18
|
+
probes: mode-switch trigger, Image/Video mode tabs, and video sub-mode tabs, in both the
|
|
19
|
+
image and video transports.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- `gflow image` commands (`t2i` / `i2i` / `upscale` / `upload`) now plumb their output
|
|
24
|
+
directory into the API client, so debug screenshots are actually captured on
|
|
25
|
+
UI-automation failures. Previously the transport's screenshot directory was never set on
|
|
26
|
+
the image path and drift errors reported `Screenshot: None` even with `--verbose`.
|
|
27
|
+
|
|
28
|
+
## [0.17.0] — 2026-06-12
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- Added `verify_flow_profile` in `gflow_cli.auth.verification` using `browser_cookie3` and `httpx` to verify sessions directly from the Chrome cookie store (fast path), with a marker-gated Playwright fallback for encrypted/locked stores. `RealChromeStrategy` now writes the Chrome marker before verification (the fallback reads it) and, on failure, rolls back only a speculative write — a marker that legitimately pre-existed (a previously-verified chrome profile) survives a transient probe failure, and an interrupted verification never leaves an unverified profile claiming the chrome strategy. Cookie extraction is centralised in the new `gflow_cli.auth.cookies` module.
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- `gflow_cli.auth.cookies._get_chrome_cookies3` now catches `RuntimeError` (Windows DPAPI failure — `RuntimeError('Failed to decrypt the cipher text with DPAPI')`) in addition to `browser_cookie3.BrowserCookieError`, and re-raises both as `PermissionError` so the Playwright fallback is triggered instead of propagating an unhandled exception.
|
|
37
|
+
- `verify_flow_profile` now retries transient HTTP failures (429/503/504) and network errors up to `_MAX_ATTEMPTS` times with exponential backoff, matching the retry behaviour of the existing Playwright-based `verify_flow_session`.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- Entity-attach `WireFormatError` failures (exit 7) now carry a remediation hint pointing at Flow's new full-page media-library UI rollout ([#174](https://github.com/ffroliva/gflow-cli/issues/174)) — affected accounts can stage entities via the include action but the submit never carries `referenceEntities`; the error now explains how to tell which UI an account has and where to follow the fix, instead of the generic file-a-bug hint. Both backstops also emit an `entity_attach_context` discovery field (`video`/`image`) for drift telemetry. New KNOWN_ISSUES entry documents the rollout
|
|
42
|
+
|
|
10
43
|
## [0.16.0] — 2026-06-12
|
|
11
44
|
|
|
12
45
|
### Fixed
|
|
@@ -1494,7 +1527,9 @@ shell-script template that branches on these codes.
|
|
|
1494
1527
|
|
|
1495
1528
|
First skeleton. Not functional end-to-end yet.
|
|
1496
1529
|
|
|
1497
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1530
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...HEAD
|
|
1531
|
+
[0.18.0]: https://github.com/ffroliva/gflow-cli/compare/v0.17.0...v0.18.0
|
|
1532
|
+
[0.17.0]: https://github.com/ffroliva/gflow-cli/compare/v0.16.0...v0.17.0
|
|
1498
1533
|
[0.16.0]: https://github.com/ffroliva/gflow-cli/compare/v0.15.1...v0.16.0
|
|
1499
1534
|
[0.15.1]: https://github.com/ffroliva/gflow-cli/compare/v0.15.0...v0.15.1
|
|
1500
1535
|
[0.15.0]: https://github.com/ffroliva/gflow-cli/compare/v0.14.0...v0.15.0
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
- Slash commands live under `.claude/commands/gflow/` (all prefixed `/gflow:`).
|
|
23
23
|
- Skills under `skills/` are auto-discoverable; `gflow-cli` ships its own at [`skills/gflow-cli/SKILL.md`](skills/gflow-cli/SKILL.md).
|
|
24
24
|
- Auto-memory at `~/.claude/projects/C--development-github-gflow-cli/memory/MEMORY.md` carries cross-session feedback and project state.
|
|
25
|
+
- **Worktrees:** the native `EnterWorktree` tool branches from `origin/main` (the default branch). Feature work integrates via `develop` — after entering a fresh worktree, immediately `git switch -c <type>/<name> origin/develop` and delete the auto-created `worktree-*` branch. On Windows, worktree removal can fail on a file lock (the worktree's `.venv`); `git worktree prune` + manual delete later is fine.
|
|
25
26
|
|
|
26
27
|
## MCP GitHub tool — PR body rule (non-negotiable)
|
|
27
28
|
|
|
@@ -14,6 +14,39 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
+
### Flow's new full-page media-library UI breaks entity attach (A/B rollout)
|
|
18
|
+
|
|
19
|
+
- **Status:** **Open** — Flow-side staged rollout; tracked in
|
|
20
|
+
[#174](https://github.com/ffroliva/gflow-cli/issues/174)
|
|
21
|
+
- **Severity:** High · **Affects:** `gflow image t2i --reference-entity` and
|
|
22
|
+
movie R2V entity attach on accounts that received the new UI, any locale
|
|
23
|
+
|
|
24
|
+
Flow is A/B-rolling a new full-page media-library UI: clicking **Add Media**
|
|
25
|
+
in the composer **navigates to a library page** (sidebar: All media /
|
|
26
|
+
Characters / Scenes / Tools, with a floating quick-create composer) instead of
|
|
27
|
+
opening the resource-picker dialog. On affected accounts the right-click
|
|
28
|
+
include action still lands (a chip appears), **but the staged entity never
|
|
29
|
+
reaches the submit** — the request carries no `referenceEntities`, so the
|
|
30
|
+
submit backstops raise `WireFormatError` (**exit 7**) instead of silently
|
|
31
|
+
returning a text-only generation as success.
|
|
32
|
+
|
|
33
|
+
**How to tell which UI your account has:** in the Flow web editor, click
|
|
34
|
+
**Add Media** — a small dialog means the old (working) UI; a navigation to a
|
|
35
|
+
full-page library means the affected new UI.
|
|
36
|
+
|
|
37
|
+
**Note:** the experiment appears to flap — the affected account observed on
|
|
38
|
+
2026-06-12 00:13 was back on the old dialog UI by 12:48 the same day (variant
|
|
39
|
+
probe, issue #174). If you hit exit 7 on entity attach, re-running later the
|
|
40
|
+
same day may simply work again.
|
|
41
|
+
|
|
42
|
+
**Workaround:** none yet on affected accounts — the attach gesture for the new
|
|
43
|
+
UI is being reverse-engineered (recon plan in
|
|
44
|
+
[docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md](docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md)).
|
|
45
|
+
If you have a second profile/account still on the old UI, entity attach works
|
|
46
|
+
there. Follow [#174](https://github.com/ffroliva/gflow-cli/issues/174) for
|
|
47
|
+
status; please report whether your account shows the dialog or the full-page
|
|
48
|
+
library (plus your locale) on that issue.
|
|
49
|
+
|
|
17
50
|
### 4K image upscale requires a Flow Ultra subscription
|
|
18
51
|
|
|
19
52
|
- **Status:** **Open** (by design — a Flow platform limit, not a gflow bug)
|
|
@@ -595,6 +628,15 @@ success. The expected authenticated response shape is pinned by the
|
|
|
595
628
|
change surfaces there as a failing test. Start any investigation of a sudden
|
|
596
629
|
`gflow auth login` verification failure at that fixture and `verification.py`.
|
|
597
630
|
|
|
631
|
+
Since PR #168 the production entry point is `verify_flow_profile`, which reads
|
|
632
|
+
the session cookie **directly from Chrome's SQLite store** via `browser_cookie3`
|
|
633
|
+
(a no-browser fast path) and only falls back to launching Playwright when that
|
|
634
|
+
decryption fails. This adds two more local surfaces to check when verification
|
|
635
|
+
fails unexpectedly: a Windows **DPAPI decrypt failure** (cross-user / cross-machine
|
|
636
|
+
key — surfaces as a `RuntimeError` that `auth/cookies.py` normalizes to
|
|
637
|
+
`PermissionError` to trigger the Playwright fallback) and a **locked cookie DB**
|
|
638
|
+
(Chrome still running holds an exclusive SQLite lock). Both degrade fail-closed.
|
|
639
|
+
|
|
598
640
|
---
|
|
599
641
|
|
|
600
642
|
## Resolved
|
|
@@ -620,8 +662,8 @@ Profiles created before this fix continue to work and display `unknown` in the
|
|
|
620
662
|
account column. Re-running `gflow auth login` against an existing profile backfills
|
|
621
663
|
the `.gflow_account` file.
|
|
622
664
|
|
|
623
|
-
See [AUTHENTICATION.md § Profile naming](AUTHENTICATION.md#profile-naming) for the
|
|
624
|
-
new naming convention and [AUTHENTICATION.md § gflow auth list](AUTHENTICATION.md#gflow-auth-list)
|
|
665
|
+
See [AUTHENTICATION.md § Profile naming](docs/AUTHENTICATION.md#profile-naming) for the
|
|
666
|
+
new naming convention and [AUTHENTICATION.md § gflow auth list](docs/AUTHENTICATION.md#gflow-auth-list)
|
|
625
667
|
for the updated `--json` schema.
|
|
626
668
|
|
|
627
669
|
---
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.18.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
|
|
@@ -37,6 +37,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
37
37
|
Classifier: Programming Language :: Python :: 3.13
|
|
38
38
|
Classifier: Topic :: Multimedia :: Video
|
|
39
39
|
Requires-Python: >=3.11
|
|
40
|
+
Requires-Dist: browser-cookie3>=0.20.1
|
|
40
41
|
Requires-Dist: click>=8.1.0
|
|
41
42
|
Requires-Dist: httpx>=0.27.0
|
|
42
43
|
Requires-Dist: platformdirs>=4.0.0
|
|
@@ -68,28 +68,43 @@ python -m pip install --pre gflow-cli
|
|
|
68
68
|
uv run pyright src
|
|
69
69
|
uv run python -m pytest -q --cov=gflow_cli
|
|
70
70
|
```
|
|
71
|
-
4.
|
|
71
|
+
4. **Live-verify the release's user-facing features and record the evidence.**
|
|
72
|
+
**Required gate — do not skip.** Exercise each new/changed user-facing feature
|
|
73
|
+
against live Flow (credit-free wherever possible — image gen, entity attach,
|
|
74
|
+
upscale, and scene/timeline ops cost no Veo credits) and write the result to
|
|
75
|
+
`docs/LIVE_VERIFICATION_vX.Y.Z.md` using the 5-layer ledger (file count + magic
|
|
76
|
+
bytes + dimensions/shape + structlog invariants + user-confirmable artifact).
|
|
77
|
+
Then add it to the "what was live-verified" entry in `docs/INDEX.md`. Every
|
|
78
|
+
release v0.7.0→v0.13.0 had this doc; it lapsed for v0.14.0–v0.15.1 — that gap is
|
|
79
|
+
the reason this is now an explicit step. If a feature genuinely cannot be live-
|
|
80
|
+
verified this cycle, say so in the doc with the reason; never silently omit it.
|
|
81
|
+
5. **Consolidate shipped planning artifacts.** Extract any durable patterns into
|
|
82
|
+
auto-memory, then remove the now-shipped `docs/superpowers/` plan / spec /
|
|
83
|
+
verification files (keep only in-flight work). Stale review docs and session
|
|
84
|
+
markers do not belong in the repo root. (Enforced by `check_repo_hygiene.py` —
|
|
85
|
+
see the root-doc allowlist.)
|
|
86
|
+
6. Update the version in:
|
|
72
87
|
- `pyproject.toml`
|
|
73
88
|
- `src/gflow_cli/__init__.py`
|
|
74
89
|
- any tests that assert the package version
|
|
75
|
-
|
|
90
|
+
7. Move user-visible changes from `CHANGELOG.md` `[Unreleased]` into a dated
|
|
76
91
|
release section.
|
|
77
|
-
|
|
92
|
+
8. Commit the release prep:
|
|
78
93
|
```bash
|
|
79
|
-
git add pyproject.toml src/gflow_cli/__init__.py CHANGELOG.md tests
|
|
94
|
+
git add pyproject.toml src/gflow_cli/__init__.py CHANGELOG.md tests docs
|
|
80
95
|
git commit -m "chore(release): vX.Y.Z"
|
|
81
96
|
```
|
|
82
|
-
|
|
97
|
+
9. Tag and push. **Must be a signed annotated tag** (`-s`) — `.github/workflows/release.yml` rejects unsigned or lightweight tags. Requires a GPG or SSH signing key registered with your GitHub account.
|
|
83
98
|
```bash
|
|
84
99
|
git tag -s vX.Y.Z -m "vX.Y.Z"
|
|
85
100
|
git push origin main
|
|
86
101
|
git push origin vX.Y.Z
|
|
87
102
|
```
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
103
|
+
10. Watch the release workflow:
|
|
104
|
+
<https://github.com/ffroliva/gflow-cli/actions/workflows/release.yml>
|
|
105
|
+
11. Confirm the new version appears on:
|
|
106
|
+
- <https://pypi.org/project/gflow-cli/>
|
|
107
|
+
- <https://github.com/ffroliva/gflow-cli/releases>
|
|
93
108
|
|
|
94
109
|
## Known Historical Quirk
|
|
95
110
|
|
|
@@ -364,6 +364,27 @@ Run: gflow auth login --profile default
|
|
|
364
364
|
|
|
365
365
|
Re-running `auth login` refreshes the cookies in place — no other state is lost.
|
|
366
366
|
|
|
367
|
+
## Session verification (cookie-store fast path)
|
|
368
|
+
|
|
369
|
+
Since v0.17.0, profile verification (run by `gflow auth login --browser chrome` after
|
|
370
|
+
capture) is handled by `gflow_cli.auth.verification.verify_flow_profile`, which probes
|
|
371
|
+
Flow's `/fx/api/auth/session` endpoint **directly from the Chrome cookie store** via
|
|
372
|
+
`browser_cookie3` + `httpx` — no browser launch needed (contributed in PR #168 by
|
|
373
|
+
@3mora2). Two hardening behaviors:
|
|
374
|
+
|
|
375
|
+
- **Encrypted/locked store fallback** — if the cookie store can't be read (e.g.
|
|
376
|
+
Windows DPAPI decryption fails, or the store is locked by a running Chrome), the
|
|
377
|
+
verifier falls back to a marker-gated Playwright probe. The chrome marker is written
|
|
378
|
+
before verification so the fallback can find the profile; on failure only a
|
|
379
|
+
*speculative* marker write is rolled back — a previously-verified profile survives a
|
|
380
|
+
transient probe failure.
|
|
381
|
+
- **Transient-error retry** — HTTP 429/503/504 and network errors retry with
|
|
382
|
+
exponential backoff before the verifier gives up.
|
|
383
|
+
|
|
384
|
+
The outcome is the same `AUTHENTICATED` / no-session decision documented under
|
|
385
|
+
[`gflow auth status`](#gflow-auth-status); only the transport is faster. Cookie
|
|
386
|
+
extraction lives in `gflow_cli.auth.cookies`.
|
|
387
|
+
|
|
367
388
|
## Threat model & limits
|
|
368
389
|
|
|
369
390
|
| Threat | Mitigation |
|
|
@@ -85,6 +85,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
85
85
|
**"How do I run with multiple Google accounts?"** → [AUTHENTICATION § Multiple accounts](AUTHENTICATION.md#multiple-accounts)
|
|
86
86
|
**"How do I know which Google account a profile is signed into?"** → [AUTHENTICATION § gflow auth list](AUTHENTICATION.md#gflow-auth-list)
|
|
87
87
|
**"Why is my profile named 'default' and how do I rename it?"** → [AUTHENTICATION § Profile naming](AUTHENTICATION.md#profile-naming)
|
|
88
|
+
**"How does login verification work without launching a browser?"** → [AUTHENTICATION § Session verification](AUTHENTICATION.md#session-verification-cookie-store-fast-path) (cookie-store fast path, v0.17.0)
|
|
88
89
|
**"How does the layered structure work?"** → [ARCHITECTURE § Layers](ARCHITECTURE.md#layers)
|
|
89
90
|
**"What env var should I set for X?"** → [CONFIGURATION § Reference](CONFIGURATION.md#reference)
|
|
90
91
|
**"What does gflow remember after a generation finishes?"** → [DATA_LAYER § What is recorded](DATA_LAYER.md#what-is-recorded)
|
|
@@ -110,7 +111,8 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
110
111
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
111
112
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
112
113
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
113
|
-
**"What was actually live-verified for the latest release?"** → v0.15.0 / v0.
|
|
114
|
+
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.18.0](LIVE_VERIFICATION_v0.18.0.md) (#183 exit-23 selector-drift error: live drift simulation + happy path, credit-free). v0.14.0 / v0.15.0 / v0.15.1 shipped without a dedicated doc (CI + the v0.13.0 baseline). Prior: [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
115
|
+
**"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.
|
|
114
116
|
**"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)
|
|
115
117
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
116
118
|
**"What is the jitter matrix evidence for `gflow image batch`?"** → [`LIVE_VERIFICATION_image_batch.md`](LIVE_VERIFICATION_image_batch.md) — jitter matrix evidence for `gflow image batch` (always-same-project mode)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Live verification — v0.16.0
|
|
2
|
+
|
|
3
|
+
> Evidence record for the v0.16.0 release. v0.16.0 ships two features: locale-free
|
|
4
|
+
> resource-picker include selectors (issue #170, PR #173) and `gflow image upscale`
|
|
5
|
+
> (issue #171, PR #172). Backfilled 2026-06-12 to close the live-verification
|
|
6
|
+
> documentation gap that opened after v0.13.0 (see docs/INDEX.md).
|
|
7
|
+
|
|
8
|
+
## Summary
|
|
9
|
+
|
|
10
|
+
- **Verified by:** ffroliva (Claude Code)
|
|
11
|
+
- **Dates:** #171 upscale — 2026-06-11 (feature branch); #170 selectors — 2026-06-12 (released PyPI artifact)
|
|
12
|
+
- **gflow-cli version:** 0.16.0
|
|
13
|
+
- **Status:** 🟢 Green — both features live-verified credit-free; no Veo credits spent
|
|
14
|
+
|
|
15
|
+
All verification below is **credit-free**: image generation, character-entity attach,
|
|
16
|
+
and image upscale are non-Veo operations (see the credits-are-videos-only note in
|
|
17
|
+
`KNOWN_ISSUES.md`). No video generation was exercised for this release.
|
|
18
|
+
|
|
19
|
+
## 1. Quality gates
|
|
20
|
+
|
|
21
|
+
- [x] **Lint/format** — `ruff check` + `ruff format --check` clean (`src` + `tests`).
|
|
22
|
+
- [x] **Type check** — `pyright src`: 0 errors.
|
|
23
|
+
- [x] **Unit + BDD tests** — full suite green in CI across Python 3.11 / 3.12 / 3.13 (PR #173, PR #172).
|
|
24
|
+
- [x] **Repo hygiene + doc links** — `check_repo_hygiene.py` + `check_doc_links.py` green.
|
|
25
|
+
|
|
26
|
+
## 2. Issue #170 — locale-free picker include selectors (PR #173)
|
|
27
|
+
|
|
28
|
+
The pt-BR-hardcoded resource-picker include selectors broke entity attach on every
|
|
29
|
+
non-Portuguese account. PR #173 replaced them with sequentially-probed tier cascades
|
|
30
|
+
(locale-invariant ligature anchor first, then localized-text fallback) and added an
|
|
31
|
+
image-side submit backstop that fails loudly (`WireFormatError`, exit 7) if a staged
|
|
32
|
+
entity never reaches the wire.
|
|
33
|
+
|
|
34
|
+
### E2E evidence (live Flow, credit-free)
|
|
35
|
+
|
|
36
|
+
| Layer | Criterion | Outcome |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| Selector tier | `include_selector_tier=icon` logged (locale-free anchor matched) | **PASS** |
|
|
39
|
+
| Attach event | `ui_automation.character_entity_attached` fired | **PASS** |
|
|
40
|
+
| Submit backstop | `ui_automation.image_entities_attached` — entity rode the wire | **PASS** |
|
|
41
|
+
| Output artifact | t2i produced a JPEG, **768×1376**, character identity visibly preserved | **PASS** |
|
|
42
|
+
| Version | all events emitted at `cli_version 0.16.0` | **PASS** |
|
|
43
|
+
|
|
44
|
+
- **Pre-merge:** live credit-free `gflow image t2i --reference-entity` on **promo-denon82**
|
|
45
|
+
(pt-BR profile). Recon harness: `scripts/dev/spike_issue170_picker_locale_recon.py`.
|
|
46
|
+
- **Released-artifact re-verification (2026-06-12):** installed `gflow-cli==0.16.0` from
|
|
47
|
+
PyPI (global `uv tool`) and re-ran the same flow on promo-denon82 — all four layers
|
|
48
|
+
above green at `cli_version 0.16.0`. **5-layer ledger PASS.**
|
|
49
|
+
- The backstop earned its keep immediately: it converted Flow's new full-page library-UI
|
|
50
|
+
A/B (issue #174) from a silent text-only "success" into a typed exit-7 failure on its
|
|
51
|
+
first live encounter.
|
|
52
|
+
|
|
53
|
+
## 3. Issue #171 — `gflow image upscale` (PR #172)
|
|
54
|
+
|
|
55
|
+
`gflow image upscale <mediaId> --scale 2k|4k` upscales a platform-generated image via
|
|
56
|
+
Flow's `POST /v1/flow/upsampleImage` (reCAPTCHA-gated, inline base64 response). 4K is
|
|
57
|
+
Ultra-gated and fails fast with `UpscaleUnavailableError` (exit 22) on lower tiers.
|
|
58
|
+
|
|
59
|
+
### E2E evidence (live Flow, credit-free)
|
|
60
|
+
|
|
61
|
+
| Layer | Criterion | Outcome |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| Wire | `POST /v1/flow/upsampleImage` accepted (full 5-field `clientContext`, action `IMAGE_GENERATION`) | **PASS** |
|
|
64
|
+
| File written | local JPEG written, **3,799,245 bytes** | **PASS** |
|
|
65
|
+
| Magic bytes | header `FF D8 FF` (valid JPEG) | **PASS** |
|
|
66
|
+
| Byte fidelity | written bytes matched the decoded wire payload | **PASS** |
|
|
67
|
+
| Tier gate | 4K returns exit 22 (`UpscaleUnavailableError`) on non-Ultra, not a generic 403 | **PASS** |
|
|
68
|
+
|
|
69
|
+
- Verified 2026-06-11 on the `feature/image-upscale` branch (= the code released as
|
|
70
|
+
v0.16.0): `gflow image upscale <mediaId> --scale 2k --project <pid>` end-to-end.
|
|
71
|
+
- Wire protocol documented in [`docs/IMAGE_UPSCALE_RECON.md`](IMAGE_UPSCALE_RECON.md).
|
|
72
|
+
|
|
73
|
+
## 4. Documentation
|
|
74
|
+
|
|
75
|
+
- `CHANGELOG.md` — v0.16.0 entry covers both features.
|
|
76
|
+
- `KNOWN_ISSUES.md` — 4K-Ultra limit documented; library-UI A/B (#174) tracked.
|
|
77
|
+
- `docs/IMAGE_UPSCALE_RECON.md` — reverse-engineered upscale wire.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Live verification — v0.17.0
|
|
2
|
+
|
|
3
|
+
> Evidence record for the v0.17.0 release. v0.17.0 ships one feature — cookie-store
|
|
4
|
+
> Flow-session verification (`verify_flow_profile`, PR #168, contributed by @3mora2)
|
|
5
|
+
> plus two hardening fixes to it — and one behavior change: the issue-#174
|
|
6
|
+
> entity-attach exit-7 remediation hint + `entity_attach_context` telemetry (PR #177).
|
|
7
|
+
|
|
8
|
+
## Summary
|
|
9
|
+
|
|
10
|
+
- **Verified by:** ffroliva (Claude Code)
|
|
11
|
+
- **Date:** 2026-06-12 (fresh run on the release tree, `develop @ 5444de8`)
|
|
12
|
+
- **gflow-cli version:** 0.17.0 (pre-tag verification)
|
|
13
|
+
- **Status:** 🟢 Green — cookie verification live-verified credit-free; the #174 hint
|
|
14
|
+
is intentionally not live-triggerable this cycle (reason recorded below)
|
|
15
|
+
|
|
16
|
+
All verification below is **credit-free**: session verification probes
|
|
17
|
+
`/fx/api/auth/session` and spends no Veo credits; no generation was exercised.
|
|
18
|
+
|
|
19
|
+
## 1. Pre-tag gates
|
|
20
|
+
|
|
21
|
+
- [x] **Repo hygiene + doc links** — `check_repo_hygiene.py` + `check_doc_links.py` green.
|
|
22
|
+
- [x] **Lint/format** — `ruff check --fix` + `ruff format`: 219 files, nothing to fix.
|
|
23
|
+
- [x] **Type check** — `pyright src`: 0 errors.
|
|
24
|
+
- [x] **Unit + BDD tests** — full suite green in CI on the exact release tree
|
|
25
|
+
(`develop @ 5444de8`, CI run 2026-06-12 13:58 UTC, success).
|
|
26
|
+
- [x] **`/gflow:doc-review`** — mechanical pass + 3-auditor council. *Council verdict:
|
|
27
|
+
GREEN / YELLOW / GREEN. 5 findings; 0 Tier 1 (release-blocking); 4 fixed in the
|
|
28
|
+
release-prep commit (KNOWN_ISSUES → AUTHENTICATION link path, AGENTS.md exit-code
|
|
29
|
+
range 3–22, new AUTHENTICATION § Session verification section, INDEX routing row);
|
|
30
|
+
1 Tier 3 deferred (dedicated `verify_flow_profile` API reference doc). Council
|
|
31
|
+
reports at `tmp/council/0{1,2,3}-*.md` (local-only).*
|
|
32
|
+
|
|
33
|
+
## 2. PR #168 — cookie-store session verification (`verify_flow_profile`)
|
|
34
|
+
|
|
35
|
+
`gflow_cli.auth.verification.verify_flow_profile` verifies a Flow session directly
|
|
36
|
+
from the Chrome cookie store via `browser_cookie3` + `httpx` (fast path), falling
|
|
37
|
+
back to a marker-gated Playwright probe when the store is encrypted/locked. The two
|
|
38
|
+
Fixed entries harden the same path: Windows DPAPI `RuntimeError` now triggers the
|
|
39
|
+
fallback instead of propagating, and transient HTTP failures (429/503/504) retry
|
|
40
|
+
with backoff.
|
|
41
|
+
|
|
42
|
+
### E2E evidence (live Google endpoint, credit-free)
|
|
43
|
+
|
|
44
|
+
Fresh run on the release tree, 2026-06-12 15:5x (UTC+1), profile **denon82**:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
$env:GFLOW_CLI_E2E_PROFILE='denon82'
|
|
48
|
+
.venv\Scripts\python.exe -m pytest tests/e2e/test_auth_verification_e2e.py -m e2e_auth -v
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Case | Criterion | Outcome |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `test_e2e_verify_flow_profile_authenticated` | Logged-in profile → `AUTHENTICATED` with a non-empty `user_email`, **and** the same profile passes `FlowApiClient.health_check()` | **PASS** |
|
|
54
|
+
| `test_e2e_verify_flow_profile_no_session` | Sessionless store → typed non-authenticated outcome (no false positive, no crash) | **PASS** |
|
|
55
|
+
| `test_e2e_verify_flow_profile_falls_back_to_playwright` | Cookie-store read failure → Playwright fallback engages and verifies | **PASS** |
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
3 passed in 17.20s
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The same three cases were also verified green live on denon82 during the PR #168
|
|
62
|
+
review council (pre-merge, same day) — this run re-confirms on the post-merge
|
|
63
|
+
release tree.
|
|
64
|
+
|
|
65
|
+
## 3. PR #177 — issue #174 entity-attach exit-7 hint + telemetry
|
|
66
|
+
|
|
67
|
+
Entity-attach `WireFormatError` failures (exit 7) now carry `ENTITY_ATTACH_DRIFT_HINT`
|
|
68
|
+
(dialog-vs-navigate self-diagnosis + link to #174) and both submit backstops emit an
|
|
69
|
+
`entity_attach_context` discovery field (`video`/`image`).
|
|
70
|
+
|
|
71
|
+
### Not live-triggerable this cycle — reason
|
|
72
|
+
|
|
73
|
+
Triggering the hint live requires an account on Flow's new full-page media-library
|
|
74
|
+
UI (the #174 A/B variant where staged entities are dropped from the submit). The
|
|
75
|
+
A/B has **rolled back off both available accounts**: the variant re-probe on
|
|
76
|
+
2026-06-12 15:48 (UTC+1) via `scripts/dev/spike_issue174_library_ui_recon.py`
|
|
77
|
+
returned `variant=dialog` on **denon82** (15 ms) and **promo-denon82** (8 ms) —
|
|
78
|
+
evidence posted on [#174](https://github.com/ffroliva/gflow-cli/issues/174).
|
|
79
|
+
With no affected account, the backstop cannot fire live without a real wire
|
|
80
|
+
regression to provoke it.
|
|
81
|
+
|
|
82
|
+
Coverage in lieu of a live trigger:
|
|
83
|
+
|
|
84
|
+
- The hint text, exit code, and `entity_attach_context` field are covered by the
|
|
85
|
+
PR #177 unit/BDD suites (green in CI on the release tree).
|
|
86
|
+
- The underlying backstops themselves were live-verified for v0.16.0 (the image
|
|
87
|
+
backstop's first live encounter is what *opened* #174 — see
|
|
88
|
+
[LIVE_VERIFICATION_v0.16.0](LIVE_VERIFICATION_v0.16.0.md)).
|
|
89
|
+
- The credit-free variant probe above exercised the real composer Add-Media path
|
|
90
|
+
on both accounts at the release tree without drift.
|
|
91
|
+
|
|
92
|
+
## Post-tag evidence
|
|
93
|
+
|
|
94
|
+
*(filled after the tag push and PyPI publish)*
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Live verification — v0.18.0
|
|
2
|
+
|
|
3
|
+
> Evidence record for the v0.18.0 release. v0.18.0 ships one feature — typed
|
|
4
|
+
> `UiSelectorDriftError` (exit code 23) for UI-automation selector-probe failures
|
|
5
|
+
> (issue #183, PR #184) — and one fix: the `gflow image` command family now wires
|
|
6
|
+
> its output directory into the API client so debug screenshots are actually
|
|
7
|
+
> captured on UI-automation failures.
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
- **Verified by:** ffroliva (Claude Code)
|
|
12
|
+
- **Date:** 2026-06-12 (live runs on the PR #184 head `45ae442`, merged unchanged
|
|
13
|
+
into `develop @ 9f1d80b`)
|
|
14
|
+
- **gflow-cli version:** 0.18.0 (pre-tag verification)
|
|
15
|
+
- **Status:** 🟢 Green — both the failure path (drift simulation) and the happy
|
|
16
|
+
path live-verified, **credit-free** (image generation spends no Veo credits)
|
|
17
|
+
|
|
18
|
+
## 1. Pre-tag gates
|
|
19
|
+
|
|
20
|
+
- `ruff check src tests` — clean; `ruff format --check` — 220 files formatted
|
|
21
|
+
- `pyright src` — 0 errors (7 pre-existing `browser_cookie3` resolution errors in
|
|
22
|
+
the local env only, untouched `auth/cookies.py`; CI green)
|
|
23
|
+
- Scoped pytest (errors + transports + cli surfaces) — 475 passed, 1 skipped
|
|
24
|
+
- PR #184 CI — 7/7 checks green on `45ae442` (test matrix 3.11/3.12/3.13,
|
|
25
|
+
gitleaks, SonarCloud)
|
|
26
|
+
|
|
27
|
+
## 2. Failure path — live drift simulation (the issue-#183 condition)
|
|
28
|
+
|
|
29
|
+
`MODE_SWITCH_TRIGGER_SELECTORS` was patched (in both transport module namespaces)
|
|
30
|
+
to a guaranteed-miss selector, reproducing exactly the reporter's DOM condition —
|
|
31
|
+
the crop_* mode-switch trigger absent from the Flow editor. The real CLI t2i path
|
|
32
|
+
was then run against live Flow (profile `denon82`, project created, $0 credits —
|
|
33
|
+
the failure fires before any generation).
|
|
34
|
+
|
|
35
|
+
| Ledger layer | Evidence |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Exit code | **23** (`UiSelectorDriftError` via `EXIT_CODE_MAP`) |
|
|
38
|
+
| File count | 1 — `debug_no_mode_trigger.png` written to the `--out` dir |
|
|
39
|
+
| Magic bytes | `\x89PNG\r\n\x1a\n` ✅ (valid PNG) |
|
|
40
|
+
| Dimensions | 1280×720 (Pillow) |
|
|
41
|
+
| structlog invariants | `selector_miss` ×1 (bogus selector) → `selector_probe_failed` → `error_raised` with full RFC 9457 problem payload; **zero** `error_unhandled` / `message_hash` events |
|
|
42
|
+
| User-visible artifact | `Flow UI selector drift: probe=mode_switch_trigger: no matching element found on the Flow editor. Screenshot: <out-dir>/debug_no_mode_trigger.png` + remediation hint (no `--verbose` claim, PII warning present) |
|
|
43
|
+
|
|
44
|
+
This is the user-facing contract the release exists for: the issue-#183 reporter
|
|
45
|
+
saw `Unexpected error` (exit 1) with the real message hashed away; on v0.18.0 the
|
|
46
|
+
same condition produces an actionable, screenshot-carrying exit-23 error.
|
|
47
|
+
|
|
48
|
+
## 3. Happy path — mode-switch unregressed
|
|
49
|
+
|
|
50
|
+
`gflow --verbose image t2i "<prompt>" --profile denon82 --aspect 9:16 --out <dir>`
|
|
51
|
+
against live Flow:
|
|
52
|
+
|
|
53
|
+
| Ledger layer | Evidence |
|
|
54
|
+
|---|---|
|
|
55
|
+
| Exit code | 0 |
|
|
56
|
+
| File count | 1 (`ec262f4c-….jpg`) |
|
|
57
|
+
| Magic bytes | `\xff\xd8\xff` ✅ (valid JPEG) |
|
|
58
|
+
| Dimensions | 768×1376 (portrait — matches `--aspect 9:16`) |
|
|
59
|
+
| structlog invariants | `image_mode_entered` fired (mode-switch dropdown found and used); no `UiSelectorDriftError` in the run |
|
|
60
|
+
| User gallery | image present in the Flow project gallery (denon82) |
|
|
61
|
+
|
|
62
|
+
## 4. Not verified this cycle (recorded, not omitted)
|
|
63
|
+
|
|
64
|
+
- **The drift error on a genuinely affected account:** the issue-#183 reporter's
|
|
65
|
+
account is in the (suspected) issue-#174 new-UI A/B cohort; both maintainer
|
|
66
|
+
accounts probed as the old dialog UI on 2026-06-12, so the organic condition is
|
|
67
|
+
not reproducible on our side. The simulation in § 2 exercises the identical
|
|
68
|
+
code path (selector cascade miss → typed raise → CLI boundary → exit 23).
|
|
69
|
+
Reporter confirmation is requested on #183.
|
|
70
|
+
- **`cli_character.py` screenshot wiring:** intentionally out of scope for this
|
|
71
|
+
release (tracked as a follow-up); its drift errors correctly omit the
|
|
72
|
+
`Screenshot:` clause.
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
-
**v0.
|
|
7
|
+
**v0.17.0 — alpha.** **Cookie-store session verification.** `verify_flow_profile` (contributed by @3mora2, PR #168) verifies a Flow session directly from the Chrome cookie store via `browser_cookie3` + `httpx` — a fast path that skips launching a browser — with a marker-gated Playwright fallback for encrypted/locked stores (Windows DPAPI failures included) and retry/backoff on transient HTTP errors. Entity-attach `WireFormatError` failures (exit 7) now carry an issue-#174-aware remediation hint plus `entity_attach_context` drift telemetry. Live-verified 2026-06-12 ([evidence](LIVE_VERIFICATION_v0.17.0.md)). Carries forward v0.16.0 (locale-free picker include selectors #170, `gflow image upscale` #171) and v0.15.1 (Docker `/dev/shm` hardening, mid-workflow 401 detection).
|
|
8
8
|
|
|
9
|
-
**Develop (unreleased, post-v0.
|
|
9
|
+
**Develop (unreleased, post-v0.17.0):** *(empty — develop is the staging branch for the next release).*
|
|
10
10
|
|
|
11
11
|
## Milestone history
|
|
12
12
|
|
|
@@ -58,6 +58,11 @@
|
|
|
58
58
|
| `gflow scene` — Add Clip / Scenes compose + credit-free server-side extended video (`runVideoFxConcatenation`) | ✅ done (v0.12.0) |
|
|
59
59
|
| `gflow video chain` — last-frame I2V chaining from a JSONL manifest (`--dry-run`/`--max-links`/`--resume-from`) | ✅ done (v0.12.0) |
|
|
60
60
|
| Create-project generation works under Flow's Agent docked chat panel | ✅ done (v0.12.0) |
|
|
61
|
+
| Video status poll raises `AuthExpiredError` (exit 3) on mid-workflow 401 (#156) + Docker `/dev/shm` hardening | ✅ done (v0.15.1) |
|
|
62
|
+
| Locale-free resource-picker include selectors — entity attach works on every account language (#170) | ✅ done (v0.16.0) |
|
|
63
|
+
| `gflow image upscale <mediaId> --scale 2k\|4k` — credit-free download-menu upscale, 4K Ultra-gated (#171) | ✅ done (v0.16.0) |
|
|
64
|
+
| Cookie-store session verification fast path (`verify_flow_profile`, PR #168) + Playwright fallback | ✅ done (v0.17.0) |
|
|
65
|
+
| Entity-attach exit-7 remediation hint + `entity_attach_context` drift telemetry (#174 interim) | ✅ done (v0.17.0) |
|
|
61
66
|
| `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
|
|
62
67
|
| Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
|
|
63
68
|
| Provider abstraction for official Veo 3.1 API | ⏳ planned |
|
|
@@ -1022,9 +1022,15 @@ shell scripts can branch on the failure mode without parsing stderr.
|
|
|
1022
1022
|
| `12` | `AuthLoginTimeoutError` | Browser sign-in was not completed in time | Re-run login or raise `GFLOW_CLI_AUTH_LOGIN_TIMEOUT` |
|
|
1023
1023
|
| `13` | `SecurityError` | Unsafe local profile or secret handling blocked | Follow the error's safety guidance |
|
|
1024
1024
|
| `14` | `AuthBrowserRejectedError` | Google rejected the login browser | `gflow auth login --browser chrome` |
|
|
1025
|
+
| `15` | `BrowserSessionClosedError` | The automation browser window was closed mid-operation | Re-run; keep the browser window open until the command finishes |
|
|
1025
1026
|
| `16` | `DataStoreError` | Local database cannot be opened, a migration failed, or the DB schema is newer than the installed gflow-cli | See below |
|
|
1026
1027
|
| `17` | `ModelModeIncompatibilityError` | The chosen video model can't do the requested mode (e.g. `--model omni-flash` with an `i2v` start/end frame — issue #125) | Use `--model veo-lite` (or veo-fast / veo-quality / veo-lite-lp) for `i2v` |
|
|
1027
1028
|
| `18` | `VideoModelSelectionError` | gflow could not select the requested video model in Flow's editor for an `i2v` run (model-picker option not found) | Usually transient — retry; if it persists, Flow's model-picker UI changed (report referencing #125) |
|
|
1029
|
+
| `19` | `SceneConcatError` | Server-side scene render/concat failed (`gflow scene --output`) | Retry; the recorded compose survives, so re-render is safe |
|
|
1030
|
+
| `20` | `FrameExtractionError` | Could not extract the last frame for a video chain link | Check the source video downloaded intact; retry the link |
|
|
1031
|
+
| `21` | `ChainPartialError` | A video chain stopped mid-way; earlier links completed | Resume from the last completed link shown in the error |
|
|
1032
|
+
| `22` | `UpscaleUnavailableError` | 4K upscale is gated to Flow **Ultra** accounts (HTTP 403) | Use `--scale 2k`, or upgrade the Flow plan |
|
|
1033
|
+
| `23` | `UiSelectorDriftError` | A Flow editor control could not be located — Google changed the frontend (issue #183) | Update gflow-cli; file a bug with the probe name + debug screenshot from the error message |
|
|
1028
1034
|
| `130`| SIGINT | User-interrupted (Ctrl-C) | — |
|
|
1029
1035
|
|
|
1030
1036
|
**Exit code 16 — data store / migration error.** Fires when:
|