gflow-cli 0.11.0__tar.gz → 0.12.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.11.0 → gflow_cli-0.12.0}/.claude/README.md +4 -1
- gflow_cli-0.12.0/.claude/commands/gflow/active.md +13 -0
- gflow_cli-0.12.0/.claude/commands/gflow/next.md +12 -0
- gflow_cli-0.12.0/.claude/commands/gflow/plan.md +22 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/predict.md +7 -1
- gflow_cli-0.12.0/.claude/commands/gflow/status.md +12 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.gitignore +6 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/AGENTS.md +5 -4
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/CHANGELOG.md +89 -1
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/CLAUDE.md +3 -2
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/GEMINI.md +3 -2
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/KNOWN_ISSUES.md +102 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/PKG-INFO +10 -2
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/PLAN.md +1 -1
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/README.md +5 -1
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/AGENT_GUIDE.md +12 -1
- gflow_cli-0.12.0/docs/CHARACTER.md +506 -0
- gflow_cli-0.12.0/docs/CHARACTER_RECON.md +147 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/CONFIGURATION.md +35 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/INDEX.md +11 -3
- gflow_cli-0.12.0/docs/LIVE_VERIFICATION_v0.12.0.md +83 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/PROJECT_STATUS.md +6 -2
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/USAGE.md +239 -0
- gflow_cli-0.12.0/docs/superpowers/character-scenario.md +140 -0
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-30-l0-sapisidhash-aisandbox-auth.md +697 -0
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-31-l0-bearer-pivot.md +97 -0
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-31-l1-scene-compose.md +1480 -0
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-31-scene-concat-extend.md +100 -0
- gflow_cli-0.12.0/docs/superpowers/plans/2026-06-02-character-creation-phase2.md +293 -0
- gflow_cli-0.12.0/docs/superpowers/plans/2026-06-02-character-creation.md +300 -0
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-30-add-clip-scene-timeline-design.md +195 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/llms.txt +2 -1
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/pyproject.toml +14 -1
- gflow_cli-0.12.0/samples/captured/12_create_scene.json +6 -0
- gflow_cli-0.12.0/samples/captured/13_sceneWorkflows_update.json +6 -0
- gflow_cli-0.12.0/samples/captured/14_get_scene_workflows.json +6 -0
- gflow_cli-0.12.0/samples/captured/15_commit_flowWorkflow.json +6 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/ci/check_doc_links.py +1 -0
- gflow_cli-0.12.0/scripts/dev/_spike_common.py +111 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/active_plan.py +1 -1
- gflow_cli-0.12.0/scripts/dev/character_create_spike.py +344 -0
- gflow_cli-0.12.0/scripts/dev/character_create_spike_v2.py +499 -0
- gflow_cli-0.12.0/scripts/dev/dump_character_selectors.js +74 -0
- gflow_cli-0.12.0/scripts/dev/spike_char_editor_dom.py +237 -0
- gflow_cli-0.12.0/scripts/dev/spike_char_gen_capture.py +349 -0
- gflow_cli-0.12.0/scripts/dev/spike_patch_entity.py +244 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/skills/README.md +11 -1
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/skills/gflow-cli/SKILL.md +48 -0
- gflow_cli-0.12.0/skills/plan/SKILL.md +215 -0
- gflow_cli-0.12.0/skills/status/SKILL.md +99 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/__init__.py +1 -1
- gflow_cli-0.12.0/src/gflow_cli/api/_sapisidhash.py +15 -0
- gflow_cli-0.12.0/src/gflow_cli/api/character.py +261 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/client.py +647 -18
- gflow_cli-0.12.0/src/gflow_cli/api/routes.py +132 -0
- gflow_cli-0.12.0/src/gflow_cli/api/scene.py +172 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +1 -8
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/ui_automation.py +516 -28
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/ui_automation_video.py +106 -32
- gflow_cli-0.12.0/src/gflow_cli/chain.py +307 -0
- gflow_cli-0.12.0/src/gflow_cli/chain_manifest.py +138 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/cli.py +4 -0
- gflow_cli-0.12.0/src/gflow_cli/cli_character.py +379 -0
- gflow_cli-0.12.0/src/gflow_cli/cli_scene.py +239 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/cli_video.py +447 -1
- gflow_cli-0.12.0/src/gflow_cli/data/chain_repo.py +128 -0
- gflow_cli-0.12.0/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +29 -0
- gflow_cli-0.12.0/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +5 -0
- gflow_cli-0.12.0/src/gflow_cli/data/migrations/0005_add_chain_links.sql +27 -0
- gflow_cli-0.12.0/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +5 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/models.py +53 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/recorder.py +310 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/repository.py +330 -4
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/errors.py +125 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/json_output.py +13 -2
- gflow_cli-0.12.0/src/gflow_cli/media.py +120 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/paths.py +21 -0
- gflow_cli-0.12.0/src/gflow_cli/services/__init__.py +6 -0
- gflow_cli-0.12.0/src/gflow_cli/services/character_create.py +299 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tasks/lessons.md +1 -1
- gflow_cli-0.12.0/tests/api/fixtures/character_gen_response.json +54 -0
- gflow_cli-0.12.0/tests/api/fixtures/patch_entity_response.json +13 -0
- gflow_cli-0.12.0/tests/api/test_aisandbox_auth_error.py +25 -0
- gflow_cli-0.12.0/tests/api/test_aisandbox_auth_headers.py +120 -0
- gflow_cli-0.12.0/tests/api/test_bearer_redaction.py +74 -0
- gflow_cli-0.12.0/tests/api/test_character.py +402 -0
- gflow_cli-0.12.0/tests/api/test_client_character.py +307 -0
- gflow_cli-0.12.0/tests/api/test_client_generate_character.py +429 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_client_image.py +5 -5
- gflow_cli-0.12.0/tests/api/test_client_patch_entity.py +158 -0
- gflow_cli-0.12.0/tests/api/test_client_scene.py +241 -0
- gflow_cli-0.12.0/tests/api/test_post_json_aisandbox_auth.py +131 -0
- gflow_cli-0.12.0/tests/api/test_routes_character.py +20 -0
- gflow_cli-0.12.0/tests/api/test_routes_scene.py +47 -0
- gflow_cli-0.12.0/tests/api/test_sapisidhash_helper.py +14 -0
- gflow_cli-0.12.0/tests/api/test_scene_models.py +120 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_ui_automation.py +131 -52
- gflow_cli-0.12.0/tests/api/transports/test_ui_character_editor.py +912 -0
- gflow_cli-0.12.0/tests/cli/test_cli_character.py +275 -0
- gflow_cli-0.12.0/tests/cli/test_cli_character_create.py +613 -0
- gflow_cli-0.12.0/tests/cli/test_cli_scene.py +160 -0
- gflow_cli-0.12.0/tests/cli/test_cli_video_chain.py +373 -0
- gflow_cli-0.12.0/tests/data/test_chain_repo.py +221 -0
- gflow_cli-0.12.0/tests/data/test_find_incomplete_character.py +217 -0
- gflow_cli-0.12.0/tests/data/test_models.py +24 -0
- gflow_cli-0.12.0/tests/data/test_recorder_character.py +254 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/test_repository.py +66 -10
- gflow_cli-0.12.0/tests/data/test_scene_persistence.py +148 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/test_store_migrations.py +1 -1
- gflow_cli-0.12.0/tests/e2e/test_aisandbox_auth_live.py +72 -0
- gflow_cli-0.12.0/tests/e2e/test_chain_e2e.py +198 -0
- gflow_cli-0.12.0/tests/e2e/test_character_create_e2e.py +442 -0
- gflow_cli-0.12.0/tests/e2e/test_scene_compose_live.py +103 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_transports_e2e.py +93 -1
- gflow_cli-0.12.0/tests/features/character_create.feature +34 -0
- gflow_cli-0.12.0/tests/features/character_read.feature +10 -0
- gflow_cli-0.12.0/tests/features/test_character_create_steps.py +288 -0
- gflow_cli-0.12.0/tests/features/test_character_read_steps.py +171 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/test_step_collision_guard.py +2 -0
- gflow_cli-0.12.0/tests/features/test_video_chain_steps.py +291 -0
- gflow_cli-0.12.0/tests/features/video_chain.feature +37 -0
- gflow_cli-0.12.0/tests/services/test_character_create_redaction.py +312 -0
- gflow_cli-0.12.0/tests/services/test_character_create_saga.py +442 -0
- gflow_cli-0.12.0/tests/services/test_character_gen_no_direct_post.py +243 -0
- gflow_cli-0.12.0/tests/smoke/__init__.py +0 -0
- gflow_cli-0.12.0/tests/test_chain.py +372 -0
- gflow_cli-0.12.0/tests/test_chain_manifest.py +243 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_errors.py +44 -0
- gflow_cli-0.12.0/tests/test_errors_403.py +19 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_marker_registry.py +1 -1
- gflow_cli-0.12.0/tests/test_media.py +158 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_paths.py +18 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/uv.lock +121 -2
- gflow_cli-0.11.0/.claude/commands/gflow/plan.md +0 -39
- gflow_cli-0.11.0/src/gflow_cli/api/routes.py +0 -64
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.continue-here.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.env.template +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.gitattributes +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.planning/issue-125-fix.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.planning/todos/pending/pr-38-review.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/.secrets.baseline +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/LICENSE +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/RELEASE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/ROADMAP.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/conftest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docker-compose.yml +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-22-pr-38-review.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-23-locale-agnostic-selectors.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/plans/2026-05-24-data-layer.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-23-locale-agnostic-selectors.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-23-readme-v0.8.1-refresh-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-24-data-layer-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/specs/2026-05-27-public-event-surface-design.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/README.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/README.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/diag_capture_flow_traffic.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/diag_recaptcha_mint.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/sonar-project.properties +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/conftest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.11.0/tests/smoke → gflow_cli-0.12.0/tests/services}/__init__.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_config.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.11.0 → gflow_cli-0.12.0}/tests/test_smoke.py +0 -0
|
@@ -12,7 +12,10 @@ This directory holds **internal maintainer workflows** that are bundled with the
|
|
|
12
12
|
└── commands/ ← repo-local slash commands
|
|
13
13
|
└── gflow/ ← `/gflow:*` namespace (avoids collision with built-ins)
|
|
14
14
|
├── check.md ← `/gflow:check` — hygiene + ruff + pyright + pytest
|
|
15
|
-
├──
|
|
15
|
+
├── status.md ← `/gflow:status` — full plan state (file, goal, progress, next task)
|
|
16
|
+
├── next.md ← `/gflow:next` — next unchecked task only
|
|
17
|
+
├── active.md ← `/gflow:active` — which plan is active, goal only
|
|
18
|
+
├── plan.md ← `/gflow:plan <feature>` — create a task-by-task implementation plan
|
|
16
19
|
├── known-issues.md← `/gflow:known-issues` — open/mitigated items
|
|
17
20
|
├── changelog.md ← `/gflow:changelog` — [Unreleased] + last tagged
|
|
18
21
|
└── release.md ← `/gflow:release` — full release flow (signed tags)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show which plan is active and its goal — orientation without task detail.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:active` — Active plan identity
|
|
6
|
+
|
|
7
|
+
**Read `skills/status/SKILL.md` and follow the `active` variant protocol.**
|
|
8
|
+
|
|
9
|
+
> Do **not** call `Skill(skill="status")` — read the file directly.
|
|
10
|
+
|
|
11
|
+
The skill at `skills/status/SKILL.md` runs `scripts/dev/active_plan.py` and returns
|
|
12
|
+
only the header lines (Plan path, Title, Goal, Progress count). Stops before the
|
|
13
|
+
`--- Next task ---` separator.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show only the next unchecked task — minimal output, no context noise.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:next [feature]` — Next task
|
|
6
|
+
|
|
7
|
+
**Read `skills/status/SKILL.md` and follow the `next` variant protocol**, passing `$ARGUMENTS` as the optional feature slug.
|
|
8
|
+
|
|
9
|
+
> Do **not** call `Skill(skill="status")` — read the file directly.
|
|
10
|
+
|
|
11
|
+
The skill at `skills/status/SKILL.md` runs `scripts/dev/active_plan.py` and returns
|
|
12
|
+
only the `--- Next task ---` block. Header lines (Plan, Title, Goal, Progress) are omitted.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create a structured task-by-task implementation plan for a feature and write it to docs/superpowers/plans/.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:plan <feature>` — Create a feature plan
|
|
6
|
+
|
|
7
|
+
**Read `skills/plan/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the feature description.
|
|
8
|
+
|
|
9
|
+
> Do **not** call `Skill(skill="plan")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable. Read the file directly instead.
|
|
10
|
+
|
|
11
|
+
The skill at `skills/plan/SKILL.md` gathers predict/scenario context, asks ≤3
|
|
12
|
+
clarifying questions, decomposes the feature into atomic committable tasks with
|
|
13
|
+
step + test checklists, and writes `docs/superpowers/plans/<date>-<slug>/PLAN.md`.
|
|
14
|
+
|
|
15
|
+
**Typical workflow:**
|
|
16
|
+
```
|
|
17
|
+
/gflow:predict <proposal> → GO / CAUTION / STOP
|
|
18
|
+
/gflow:scenario <feature> → edge cases + BDD skeleton
|
|
19
|
+
/gflow:plan <feature> → writes PLAN.md ← this command
|
|
20
|
+
/gflow:status → surfaces next task
|
|
21
|
+
/gflow:check → before each commit
|
|
22
|
+
```
|
|
@@ -16,4 +16,10 @@ The skill at `skills/predict/SKILL.md` runs five independent expert personas
|
|
|
16
16
|
(Architect · Security/reCAPTCHA · Performance/Playwright · CLI UX · Devil's Advocate),
|
|
17
17
|
resolves conflicts, and returns a GO / CAUTION / STOP verdict with a confidence score.
|
|
18
18
|
|
|
19
|
-
**
|
|
19
|
+
**Typical workflow after a GO or CAUTION:**
|
|
20
|
+
```
|
|
21
|
+
/gflow:scenario <feature> → edge cases + BDD skeleton
|
|
22
|
+
/gflow:plan <feature> → writes PLAN.md task checklist
|
|
23
|
+
/gflow:status → surfaces next task during execution
|
|
24
|
+
/gflow:check → before each commit
|
|
25
|
+
```
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show current plan state — active plan file, goal, progress, and next unchecked task.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:status [feature]` — Current plan state
|
|
6
|
+
|
|
7
|
+
**Read `skills/status/SKILL.md` and follow the `status` variant protocol**, passing `$ARGUMENTS` as the optional feature slug.
|
|
8
|
+
|
|
9
|
+
> Do **not** call `Skill(skill="status")` — read the file directly.
|
|
10
|
+
|
|
11
|
+
The skill at `skills/status/SKILL.md` runs `scripts/dev/active_plan.py` and returns
|
|
12
|
+
the full output: plan file path, title, goal, progress (X/N), and next task block.
|
|
@@ -63,6 +63,9 @@ samples/*.captured.json # sandbox-recorded API exchanges may contain PII
|
|
|
63
63
|
test_assets/smoke_*/
|
|
64
64
|
test_assets/debug_*/
|
|
65
65
|
|
|
66
|
+
# Phase-2 live-spike capture outputs — NEVER commit (may contain real API payloads)
|
|
67
|
+
scripts/dev/_spike_out/
|
|
68
|
+
|
|
66
69
|
# Live Flow traffic captures — NEVER commit (contain real Bearer tokens / API keys).
|
|
67
70
|
# Diagnostic scripts MUST default-write here, NOT to samples/captured/.
|
|
68
71
|
# Sanitised reference samples (no secrets) can still live under samples/captured/.
|
|
@@ -83,3 +86,6 @@ worktrees/
|
|
|
83
86
|
|
|
84
87
|
# E2E test logs (live Flow runs — may contain account/profile names)
|
|
85
88
|
.planning/e2e-logs/
|
|
89
|
+
|
|
90
|
+
# Understand Anything (local knowledge graph)
|
|
91
|
+
.understand-anything/
|
|
@@ -8,7 +8,8 @@ Supported tools that auto-discover this file: Cursor, Codex, Aider, Jules, Devin
|
|
|
8
8
|
|
|
9
9
|
- Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com`.
|
|
10
10
|
- Python 3.11+ · `uv`-managed · `hatchling` builds · Playwright Chromium transport · `pyright` strict · `ruff` · `pytest`.
|
|
11
|
-
- Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_data.py`, `cli_image.py`, `cli_run.py`, `cli_video.py`, `config.py`, `data/`, `errors.py`, `exceptions.py`, `image_batch.py`, `manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
|
|
11
|
+
- Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_character.py`, `cli_data.py`, `cli_image.py`, `cli_models.py`, `cli_run.py`, `cli_scene.py`, `cli_video.py`, `config.py`, `data/`, `errors.py`, `exceptions.py`, `image_batch.py`, `manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
|
|
12
|
+
- Command surface: `gflow auth`, `gflow image` (t2i/i2i/upload), `gflow video` (t2v/i2v/r2v/batch/chain), `gflow character` (create/list/show/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), and `gflow data` (catalog queries).
|
|
12
13
|
- Requires a Google AI Ultra or Pro subscription with Flow access. All generations bill against the user's own Google account.
|
|
13
14
|
|
|
14
15
|
## Headed-browser dependency (architectural reality)
|
|
@@ -28,7 +29,7 @@ If you can help unblock a pure HTTP transport (especially for video generation,
|
|
|
28
29
|
- Copy `.env.template` to `.env.local`; never commit `.env.local`. It documents every env var.
|
|
29
30
|
- Output goes to `./tmp/` for scripts/tests or `$GFLOW_CLI_OUTPUT_DIR` for CLI outputs (defaults to `./out/`).
|
|
30
31
|
- One-time auth: `gflow auth login --browser chrome`. The `--browser chrome` flag is mandatory; the CLI fails fast on other strategies.
|
|
31
|
-
- Use `/gflow:
|
|
32
|
+
- Use `/gflow:status` to see the current task before starting work; `/gflow:known-issues` before touching auth or reCAPTCHA code paths.
|
|
32
33
|
|
|
33
34
|
## Testing instructions — The Impeccable Routine
|
|
34
35
|
|
|
@@ -55,7 +56,7 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
55
56
|
|
|
56
57
|
- Type hints everywhere; `pyright` strict on `src/gflow_cli`.
|
|
57
58
|
- Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
|
|
58
|
-
- 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–21, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
|
|
59
60
|
- 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
|
|
60
61
|
|
|
61
62
|
## PR instructions
|
|
@@ -89,7 +90,7 @@ The SkillOpt harness at `scripts/dev/skillopt/` measures how accurately each ski
|
|
|
89
90
|
- **Mandates & routing rules** → [docs/AGENT_GUIDE.md](docs/AGENT_GUIDE.md)
|
|
90
91
|
- **Full docs index** → [docs/INDEX.md](docs/INDEX.md)
|
|
91
92
|
- **Known issues** (read before touching auth / reCAPTCHA) → [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
|
|
92
|
-
- **
|
|
93
|
+
- **Current task** → `/gflow:status` · **Create a feature plan** → `/gflow:plan <feature>` · **Full roadmap** → [PLAN.md](PLAN.md)
|
|
93
94
|
- **Release protocol** → [RELEASE.md](RELEASE.md)
|
|
94
95
|
|
|
95
96
|
## Claude Code-specific notes
|
|
@@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.12.0] — 2026-06-03
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Create-project generation failing when Flow opens the Agent _chat panel_.**
|
|
15
|
+
A follow-up to the earlier Agent-pill fix: Flow now also surfaces Agent mode as
|
|
16
|
+
a docked chat side-panel ("Untitled session") on some project opens, and while
|
|
17
|
+
it is up the in-composer Agent pill is absent from the DOM — so the pill-only
|
|
18
|
+
recovery could not find anything to click and generation still failed with
|
|
19
|
+
"mode-switch dropdown trigger not found". `_exit_agent_mode` now handles both
|
|
20
|
+
Agent shapes in one pass: it dismisses the chat panel (locale-stable, aria-free
|
|
21
|
+
structural close anchor) which reveals the pill, then turns the pill off,
|
|
22
|
+
looping until the media panel re-mounts. Keyed on the outcome (`crop_*` is
|
|
23
|
+
back), so it covers pill-only, panel-only, and panel-then-pill without assuming
|
|
24
|
+
which control is present.
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- **`gflow character` command group — reusable Flow Character entities (#145).**
|
|
29
|
+
Mint a project-scoped **Character** (a named subject with reference images, an
|
|
30
|
+
optional voice, and an optional personality) so the same subject appears
|
|
31
|
+
consistently across generations:
|
|
32
|
+
- `gflow character create --project <pid> --name <name> --face-prompt "…"
|
|
33
|
+
[--body-prompt "…"] [--voice <Name>] [--personality "…"]
|
|
34
|
+
[--model nano2|nanopro]` — two-step generation: a **face** reference (slot 0),
|
|
35
|
+
then a self-contained **front/side/back triptych body** (slot 1) seeded by the
|
|
36
|
+
generated face. gflow injects its own triptych instruction, so one body
|
|
37
|
+
generation yields all three angles. Characters have **no aspect-ratio
|
|
38
|
+
control** and exactly two models — `nano2` (Nano Banana 2, default) and
|
|
39
|
+
`nanopro` (Nano Banana Pro). Generated images are **downloaded** to local (or
|
|
40
|
+
cloud) storage; the signed `fifeUrl` is used only at download and never
|
|
41
|
+
persisted.
|
|
42
|
+
- `gflow character list --project <pid>` — list every Character in a project.
|
|
43
|
+
- `gflow character show --project <pid> (--id <entityId> | --name <name>)` —
|
|
44
|
+
show one Character; an ambiguous `--name` exits 11.
|
|
45
|
+
- `gflow character voices` — list the 29-name Gemini voice catalog
|
|
46
|
+
(name / description / sample-url); `--voice` is validated case-insensitively.
|
|
47
|
+
|
|
48
|
+
The credited generation rides Flow's own page JS in the character editor
|
|
49
|
+
(Option B, UI passive-capture — a self-assembled direct POST is reCAPTCHA-403
|
|
50
|
+
walled); the structural calls (createEntity, workflow/entity PATCH,
|
|
51
|
+
projectInitialData) are credit-free REST. Creation runs as a
|
|
52
|
+
**persist-before-spend, crash-recoverable saga**: the `entityId` and each
|
|
53
|
+
completed slot are recorded before/as credits are spent, so a crashed run
|
|
54
|
+
resumes without orphaning a paid generation or double-charging. Live-verified
|
|
55
|
+
end-to-end on 2026-06-02 (face + triptych body, both bound, downloaded, read
|
|
56
|
+
back). See [docs/CHARACTER.md](docs/CHARACTER.md).
|
|
57
|
+
|
|
58
|
+
- **`gflow video chain` — last-frame I2V chaining.** Render a JSONL manifest of
|
|
59
|
+
*links* into one continuous sequence: link 0 is a text-to-video generation,
|
|
60
|
+
and every later link is an image-to-video generation **seeded by the extracted
|
|
61
|
+
last frame of the previous clip**, giving visual continuity with no
|
|
62
|
+
server-side stitching. Each link is a sequential paid Veo generation (**one
|
|
63
|
+
credit per link**); a cost-confirmation gate (`-y`/`--yes` to skip),
|
|
64
|
+
`--dry-run` plan preview, `--max-links` cap (exit 11), and
|
|
65
|
+
`--resume-from <chain-id>` (skips already-paid links, no re-billing) make the
|
|
66
|
+
spend explicit and recoverable. Per-link wire-route checking aborts loudly if
|
|
67
|
+
Flow drops the seed frame and routes an i2v link to the text-only endpoint
|
|
68
|
+
(issue #125), so a misroute can never be reported as a successful chain.
|
|
69
|
+
Only the Veo 3.1 models (`veo-lite`/`veo-fast`/`veo-quality`/`veo-lite-lp`)
|
|
70
|
+
are accepted; `omni-flash` is rejected. Chain links are recorded locally
|
|
71
|
+
(SQLite migration `0005`) to drive `--resume-from`. The frame extractor uses
|
|
72
|
+
PyAV via a new optional **`[chain]`** extra (`pip install 'gflow-cli[chain]'`)
|
|
73
|
+
— no system ffmpeg required. Each link is saved as its own mp4; concatenating
|
|
74
|
+
the clips into one file is a separate step — use `gflow scene` (auto-concat is
|
|
75
|
+
deferred, see [KNOWN_ISSUES.md](KNOWN_ISSUES.md)).
|
|
76
|
+
|
|
77
|
+
- **`gflow scene` command group (Add Clip / Scenes).** Compose ordered,
|
|
78
|
+
trimmable video clips into a Flow **Scene** over the credit-free aisandbox
|
|
79
|
+
REST surface (no reCAPTCHA, no credits):
|
|
80
|
+
- `gflow scene create --project <pid> <workflowId>[:<start>-<end>] [...]` —
|
|
81
|
+
compose a scene from one or more existing clips (repeat an id to duplicate;
|
|
82
|
+
optional per-clip trim in seconds).
|
|
83
|
+
- `gflow scene show --scene <sid> --project <pid>` — read back a scene's clip
|
|
84
|
+
order and trims.
|
|
85
|
+
- `gflow scene create … --output extended.mp4` — render the composed scene
|
|
86
|
+
into a single **extended video** via Flow's server-side concatenation
|
|
87
|
+
(`runVideoFxConcatenation`) — credit-free, no reCAPTCHA, **no ffmpeg**. The
|
|
88
|
+
combined MP4 is fetched inline and written locally (or to the configured
|
|
89
|
+
cloud `storage_uri`). `--force` overwrites an existing output.
|
|
90
|
+
|
|
91
|
+
Scene compositions are recorded locally (SQLite migration `0003`) — including
|
|
92
|
+
each clip's media id + trims, and the rendered extended-video path (migration
|
|
93
|
+
`0004`) — so a compose survives a later render failure and the output is
|
|
94
|
+
discoverable for recovery. The append-to-existing-scene verb (`add-clip`) is
|
|
95
|
+
deferred — see the project backlog.
|
|
96
|
+
|
|
10
97
|
## [0.11.0] — 2026-05-31
|
|
11
98
|
|
|
12
99
|
### Changed
|
|
@@ -1269,7 +1356,8 @@ shell-script template that branches on these codes.
|
|
|
1269
1356
|
|
|
1270
1357
|
First skeleton. Not functional end-to-end yet.
|
|
1271
1358
|
|
|
1272
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1359
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.12.0...HEAD
|
|
1360
|
+
[0.12.0]: https://github.com/ffroliva/gflow-cli/compare/v0.11.0...v0.12.0
|
|
1273
1361
|
[0.11.0]: https://github.com/ffroliva/gflow-cli/compare/v0.10.0...v0.11.0
|
|
1274
1362
|
[0.10.0]: https://github.com/ffroliva/gflow-cli/compare/v0.9.1...v0.10.0
|
|
1275
1363
|
[0.9.1]: https://github.com/ffroliva/gflow-cli/compare/v0.9.0...v0.9.1
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
|
|
12
12
|
2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
|
|
13
13
|
3. Pull deeper context on demand:
|
|
14
|
-
-
|
|
14
|
+
- Current task / where we left off → `/gflow:status`
|
|
15
|
+
- Starting a new feature → `/gflow:predict` → `/gflow:scenario` → `/gflow:plan <feature>`
|
|
15
16
|
- Touching auth or reCAPTCHA → `/gflow:known-issues`
|
|
16
17
|
- Cutting a release → `/gflow:release`
|
|
17
18
|
- Before any commit → `/gflow:check`
|
|
@@ -38,4 +39,4 @@ The heredoc pattern (`$(cat <<'EOF' ... EOF)`) is only valid inside a `Bash` too
|
|
|
38
39
|
|
|
39
40
|
## Active phase
|
|
40
41
|
|
|
41
|
-
See [PLAN.md](PLAN.md) or run `/gflow:
|
|
42
|
+
See [PLAN.md](PLAN.md) or run `/gflow:status` for current task. Run `/gflow:plan <feature>` to create a new feature plan.
|
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
|
|
12
12
|
2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
|
|
13
13
|
3. Pull deeper context on demand:
|
|
14
|
-
-
|
|
14
|
+
- Current task / where we left off → `/gflow:status`
|
|
15
|
+
- Starting a new feature → `/gflow:predict` → `/gflow:scenario` → `/gflow:plan <feature>`
|
|
15
16
|
- Touching auth or reCAPTCHA → `/gflow:known-issues`
|
|
16
17
|
- Cutting a release → `/gflow:release`
|
|
17
18
|
- Before any commit → `/gflow:check`
|
|
@@ -24,4 +25,4 @@
|
|
|
24
25
|
|
|
25
26
|
## Active phase
|
|
26
27
|
|
|
27
|
-
See [PLAN.md](PLAN.md) or run `/gflow:
|
|
28
|
+
See [PLAN.md](PLAN.md) or run `/gflow:status` for current task. Run `/gflow:plan <feature>` to create a new feature plan.
|
|
@@ -65,6 +65,21 @@ a different 401** — it occurs on a profile that *is* verified and *can* create
|
|
|
65
65
|
projects, specifically on the `aisandbox-pa.googleapis.com` generation
|
|
66
66
|
endpoint, a different surface from the `labs.google` tRPC API.
|
|
67
67
|
|
|
68
|
+
> **Related — L0 aisandbox Bearer auth (`feature/scene-add-clip`, 2026-05-31):**
|
|
69
|
+
> the `aisandbox-pa` 401 is NOT a SAPISIDHASH issue — live verification proved
|
|
70
|
+
> the real header is **`Authorization: Bearer ya29.<oauth>`** (the SPA's OAuth2
|
|
71
|
+
> access token, fetched from `GET /fx/api/auth/session`). `page.request` 401s
|
|
72
|
+
> because it sends cookies but not that token. The `gflow scene` groundwork now
|
|
73
|
+
> fetches+caches the token and attaches the Bearer to the **`page.request` REST
|
|
74
|
+
> path** (`_post_json` / `_patch_json`, host-scoped to `aisandbox-pa`) so
|
|
75
|
+
> `uploadImage` / `scenes` / `commit` authenticate — see
|
|
76
|
+
> [`docs/superpowers/plans/2026-05-31-l0-bearer-pivot.md`](docs/superpowers/plans/2026-05-31-l0-bearer-pivot.md).
|
|
77
|
+
> **Live-verified 2026-05-31:** REST `uploadImage` returns 200
|
|
78
|
+
> (`tests/e2e/test_aisandbox_auth_live.py`, credit-free).
|
|
79
|
+
> **Liberating follow-up:** the same Bearer likely unlocks the `evaluate_fetch`
|
|
80
|
+
> generation 401 above (and REST generation generally, modulo reCAPTCHA) —
|
|
81
|
+
> deferred, not yet applied to that transport.
|
|
82
|
+
|
|
68
83
|
**Scope.** The 401 affects every image-generation path uniformly on the
|
|
69
84
|
`evaluate_fetch` transport (the live one): `test_e2e_single_image_gen` (C2,
|
|
70
85
|
pre-existing), `test_e2e_generate_image_without_project_id` (PR #20,
|
|
@@ -446,6 +461,93 @@ sample is captured.
|
|
|
446
461
|
|
|
447
462
|
---
|
|
448
463
|
|
|
464
|
+
### `gflow video chain` re-exposes the i2v→t2v silent-route risk (issue #125)
|
|
465
|
+
|
|
466
|
+
- **Status:** Mitigated · **Severity:** Medium · **Affects:** `gflow video chain` (v0.12.0)
|
|
467
|
+
|
|
468
|
+
Every chain link after the first is an image-to-video (I2V) generation seeded by
|
|
469
|
+
the previous clip's last frame. The same silent-route defect that affects
|
|
470
|
+
`gflow video i2v` ([issue #125](https://github.com/ffroliva/gflow-cli/issues/125))
|
|
471
|
+
applies here: if the chosen model can't do i2v interpolation, Flow drops the
|
|
472
|
+
seed frame and routes the request to the plain text-to-video endpoint
|
|
473
|
+
(`batchAsyncGenerateVideoText`) — burning a credit for a text-only clip that
|
|
474
|
+
breaks continuity, with no error from Flow.
|
|
475
|
+
|
|
476
|
+
**Mitigation (two layers):**
|
|
477
|
+
1. **Model pin.** `omni-flash` (the only model known to silently drop frames) is
|
|
478
|
+
removed from the chain `--model` choices, and the orchestrator rejects any
|
|
479
|
+
model whose `supports_i2v_interpolation()` is false **before any spend**
|
|
480
|
+
(`ModelModeIncompatibilityError`, exit 17).
|
|
481
|
+
2. **Per-link wire-route abort.** For each seeded link the transport inspects the
|
|
482
|
+
captured generate-response URL; if it observes `batchAsyncGenerateVideoText`
|
|
483
|
+
for an i2v link it raises `WireFormatError` (logged
|
|
484
|
+
`ui_automation_video.i2v_routed_to_t2v`, issue #125) rather than reporting a
|
|
485
|
+
fake success. The chain aborts and preserves every link completed before the
|
|
486
|
+
failure (`ChainPartialError`).
|
|
487
|
+
|
|
488
|
+
**Workaround:** stick to the Veo 3.1 models (`veo-lite` / `veo-fast` /
|
|
489
|
+
`veo-quality` / `veo-lite-lp`); these are the only accepted chain models.
|
|
490
|
+
|
|
491
|
+
---
|
|
492
|
+
|
|
493
|
+
### `gflow video chain` continuity caveat — black / fade-out final frame
|
|
494
|
+
|
|
495
|
+
- **Status:** Open · **Severity:** Low · **Affects:** `gflow video chain` (v0.12.0)
|
|
496
|
+
|
|
497
|
+
Chain seeds each link with the **last frame** of the previous clip. If a clip
|
|
498
|
+
fades to black (or to a near-empty frame) at its very end — common with
|
|
499
|
+
cinematic prompts — the extracted seed frame is mostly black, so the next link
|
|
500
|
+
starts from black and continuity visibly breaks.
|
|
501
|
+
|
|
502
|
+
**Workaround:** pass `--seed-offset MS` to extract the seed frame a few hundred
|
|
503
|
+
milliseconds **before** end-of-file, skipping the fade. For example
|
|
504
|
+
`--seed-offset 200` seeds from 200 ms before EOF. Tune per the fade length of
|
|
505
|
+
your prompts.
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
### `gflow video chain` outputs N clips, not one file — auto-concat is deferred
|
|
510
|
+
|
|
511
|
+
- **Status:** Open (by design) · **Severity:** Low · **Affects:** `gflow video chain` (v0.12.0)
|
|
512
|
+
|
|
513
|
+
A chain produces **N separate mp4s** (one per link), not a single stitched
|
|
514
|
+
video. Auto-concatenation is deferred: Flow's server-side concatenation
|
|
515
|
+
(`runVideoFxConcatenation`, used by `gflow scene`) is **project-scoped** — every
|
|
516
|
+
clip must live in the same Flow project to be concatenated. But chain links are
|
|
517
|
+
*generated* sequentially and generation cannot pin all links to one shared
|
|
518
|
+
project, so there is no clip set the concat endpoint could combine at the end of
|
|
519
|
+
a chain run.
|
|
520
|
+
|
|
521
|
+
**Workaround:** stitch the link clips into one file with `gflow scene`
|
|
522
|
+
(server-side, credit-free, no ffmpeg) after the chain completes. The chain
|
|
523
|
+
prints its `chain_id` and a reminder to do this on success.
|
|
524
|
+
|
|
525
|
+
**Roadmap:** wiring chain links into a single Flow project so the chain can
|
|
526
|
+
auto-concat its own output is under consideration — tracked as backlog.
|
|
527
|
+
|
|
528
|
+
---
|
|
529
|
+
|
|
530
|
+
### `gflow video chain --resume-from` re-seeds the first resumed link as T2V
|
|
531
|
+
|
|
532
|
+
- **Status:** Open · **Severity:** Low · **Affects:** `gflow video chain` (v0.12.0)
|
|
533
|
+
|
|
534
|
+
`--resume-from <chain-id>` skips links already paid for in a prior run (they are
|
|
535
|
+
**not** re-billed) and continues from the first incomplete link. However, the
|
|
536
|
+
first resumed link is generated as a **text-to-video** link, not seeded from the
|
|
537
|
+
last frame of the last completed link — there is no cross-run seed-frame
|
|
538
|
+
hand-off yet. The resume is **credit-safe** (no double-billing), but visual
|
|
539
|
+
continuity restarts at the resume point: the first resumed clip will not flow
|
|
540
|
+
seamlessly from the clip before it.
|
|
541
|
+
|
|
542
|
+
**Workaround:** if seamless continuity across a resume boundary matters, re-run
|
|
543
|
+
the affected tail of the chain from scratch rather than resuming, or stitch with
|
|
544
|
+
`gflow scene` and accept the cut at the resume boundary.
|
|
545
|
+
|
|
546
|
+
**Roadmap:** persist and re-extract the boundary seed frame so a resumed link can
|
|
547
|
+
continue as a seeded I2V generation — tracked as backlog.
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
449
551
|
## Mitigated
|
|
450
552
|
|
|
451
553
|
### Auth verification depends on Google's NextAuth session endpoint
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.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
|
|
@@ -45,7 +45,11 @@ Requires-Dist: pydantic-settings>=2.5.0
|
|
|
45
45
|
Requires-Dist: rich>=13.7.0
|
|
46
46
|
Requires-Dist: structlog>=24.0.0
|
|
47
47
|
Requires-Dist: tenacity>=8.2
|
|
48
|
+
Provides-Extra: chain
|
|
49
|
+
Requires-Dist: av>=12; extra == 'chain'
|
|
48
50
|
Provides-Extra: dev
|
|
51
|
+
Requires-Dist: av>=12; extra == 'dev'
|
|
52
|
+
Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
49
53
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
50
54
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
51
55
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
@@ -82,6 +86,7 @@ Description-Content-Type: text/markdown
|
|
|
82
86
|
For Google AI Ultra / Pro subscribers with Veo credits and batch workloads:
|
|
83
87
|
|
|
84
88
|
- **Burn credits efficiently** — `for p in $(cat prompts.txt); do gflow image t2i "$p"; done` _(image batching, plus `gflow video t2v`/`i2v`/`r2v`, all ship today)_
|
|
89
|
+
- **Reuse a subject across shots** — `gflow character create` mints a Flow **Character** (face + body reference) so the same person appears consistently from generation to generation
|
|
85
90
|
- **Build pipelines** — wire Veo into your content automation, AI video stack, or batch experiments
|
|
86
91
|
- **Stay in the terminal** — no Chromium UI, no clicking through dialogs (after a one-time `gflow auth login`)
|
|
87
92
|
|
|
@@ -101,6 +106,8 @@ gflow auth login --browser chrome
|
|
|
101
106
|
gflow image t2i "a hot air balloon over Tokyo at sunrise"
|
|
102
107
|
# or:
|
|
103
108
|
gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16:9
|
|
109
|
+
# or mint a reusable Character (face + body reference):
|
|
110
|
+
gflow character create --project <id> --name "Aria" --face-prompt "..." --body-prompt "..."
|
|
104
111
|
```
|
|
105
112
|
|
|
106
113
|
Outputs land under `$GFLOW_CLI_OUTPUT_DIR` unless
|
|
@@ -132,6 +139,7 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
|
|
|
132
139
|
|---|---|
|
|
133
140
|
| 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
|
|
134
141
|
| **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
|
|
142
|
+
| 🎭 **Characters** | [Characters](docs/CHARACTER.md) — reusable subjects (`gflow character`) |
|
|
135
143
|
| 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
|
|
136
144
|
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
137
145
|
| 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
|
|
@@ -170,7 +178,7 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
|
|
|
170
178
|
|
|
171
179
|
## Project status
|
|
172
180
|
|
|
173
|
-
**v0.
|
|
181
|
+
**v0.12.0 — alpha.** Three new capabilities. **`gflow character`** mints reusable, project-scoped Flow **Character** entities — a named subject with reference images, an optional voice, and an optional personality — so the same subject stays consistent across generations (`create` / `list` / `show` / `voices`, #145). **`gflow scene`** composes ordered clips into a scene and renders a credit-free, server-side **extended video** (no local ffmpeg). **`gflow video chain`** links last-frame image-to-video clips from a JSONL manifest into one continuous sequence. This release also fixes create-project generation when Flow surfaces Agent mode as a docked chat panel. Baseline: Image (T2I / I2I / upload) + Video T2V / I2V / R2V live end-to-end on `ui_automation`, with a video `--model` picker (5 Veo models) + `--duration` / `--count` (v0.11.0 repaired `gflow video i2v`, issue #125, and hardened image-model selection for non-English Flow UIs, #94; v0.10.0 added `--json` across every generation command, a `gflow models` catalog, per-model reference caps, persisted profile identity, external S3 / MinIO / GCS storage, and `gflow data prune`). Only video `batch` (manifest runner) is still queued for Phase B — use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)). Full milestone history → [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md). Changelog → [CHANGELOG.md](CHANGELOG.md). Where the project is heading → [ROADMAP.md](ROADMAP.md).
|
|
174
182
|
|
|
175
183
|
## License & legal
|
|
176
184
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **Status:** Living document. Updated as phases complete.
|
|
4
4
|
> **Owner:** [@ffroliva](https://github.com/ffroliva)
|
|
5
|
-
> **Last revised:** 2026-
|
|
5
|
+
> **Last revised:** 2026-06-03 (v0.12.0 release — `gflow character` reusable Flow Character entities (#145), `gflow scene` Add Clip + credit-free server-side extended video, `gflow video chain` last-frame I2V chaining, create-project fix under Flow's Agent chat panel)
|
|
6
6
|
|
|
7
7
|
This plan turns the v0.1 scaffold into a production-grade CLI for Google AI Ultra/Pro subscribers who want to spend their Flow credits via batch automation. The plan is opinionated, treating this repo as a portfolio-grade benchmark.
|
|
8
8
|
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
For Google AI Ultra / Pro subscribers with Veo credits and batch workloads:
|
|
23
23
|
|
|
24
24
|
- **Burn credits efficiently** — `for p in $(cat prompts.txt); do gflow image t2i "$p"; done` _(image batching, plus `gflow video t2v`/`i2v`/`r2v`, all ship today)_
|
|
25
|
+
- **Reuse a subject across shots** — `gflow character create` mints a Flow **Character** (face + body reference) so the same person appears consistently from generation to generation
|
|
25
26
|
- **Build pipelines** — wire Veo into your content automation, AI video stack, or batch experiments
|
|
26
27
|
- **Stay in the terminal** — no Chromium UI, no clicking through dialogs (after a one-time `gflow auth login`)
|
|
27
28
|
|
|
@@ -41,6 +42,8 @@ gflow auth login --browser chrome
|
|
|
41
42
|
gflow image t2i "a hot air balloon over Tokyo at sunrise"
|
|
42
43
|
# or:
|
|
43
44
|
gflow video t2v "Slow cinematic push-in on a sunlit forest clearing" --aspect 16:9
|
|
45
|
+
# or mint a reusable Character (face + body reference):
|
|
46
|
+
gflow character create --project <id> --name "Aria" --face-prompt "..." --body-prompt "..."
|
|
44
47
|
```
|
|
45
48
|
|
|
46
49
|
Outputs land under `$GFLOW_CLI_OUTPUT_DIR` unless
|
|
@@ -72,6 +75,7 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
|
|
|
72
75
|
|---|---|
|
|
73
76
|
| 🎯 **Getting started** | [User Guide](docs/USER_GUIDE.md) · [Usage](docs/USAGE.md) · [Configuration](docs/CONFIGURATION.md) |
|
|
74
77
|
| **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
|
|
78
|
+
| 🎭 **Characters** | [Characters](docs/CHARACTER.md) — reusable subjects (`gflow character`) |
|
|
75
79
|
| 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
|
|
76
80
|
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
77
81
|
| 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
|
|
@@ -110,7 +114,7 @@ gflow CLI → Provider (interchangeable) → Flow (ui_automation) / Mock (te
|
|
|
110
114
|
|
|
111
115
|
## Project status
|
|
112
116
|
|
|
113
|
-
**v0.
|
|
117
|
+
**v0.12.0 — alpha.** Three new capabilities. **`gflow character`** mints reusable, project-scoped Flow **Character** entities — a named subject with reference images, an optional voice, and an optional personality — so the same subject stays consistent across generations (`create` / `list` / `show` / `voices`, #145). **`gflow scene`** composes ordered clips into a scene and renders a credit-free, server-side **extended video** (no local ffmpeg). **`gflow video chain`** links last-frame image-to-video clips from a JSONL manifest into one continuous sequence. This release also fixes create-project generation when Flow surfaces Agent mode as a docked chat panel. Baseline: Image (T2I / I2I / upload) + Video T2V / I2V / R2V live end-to-end on `ui_automation`, with a video `--model` picker (5 Veo models) + `--duration` / `--count` (v0.11.0 repaired `gflow video i2v`, issue #125, and hardened image-model selection for non-English Flow UIs, #94; v0.10.0 added `--json` across every generation command, a `gflow models` catalog, per-model reference caps, persisted profile identity, external S3 / MinIO / GCS storage, and `gflow data prune`). Only video `batch` (manifest runner) is still queued for Phase B — use a shell for-loop until then ([USAGE](docs/USAGE.md#gflow-video-batch)). Full milestone history → [docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md). Changelog → [CHANGELOG.md](CHANGELOG.md). Where the project is heading → [ROADMAP.md](ROADMAP.md).
|
|
114
118
|
|
|
115
119
|
## License & legal
|
|
116
120
|
|
|
@@ -23,9 +23,20 @@ These are non-negotiable. They override default agent behavior where conflicts e
|
|
|
23
23
|
- **Back-merge `main → develop` after every release.** See the `release-back-merge-gap-recovery` runbook in agent memory.
|
|
24
24
|
- **Enforce model-dependent reference caps.** Flow's R2V (reference-to-video) and I2I (image-to-image) reference image caps are model-dependent (Omni=7, Veo Lite/Fast=3, Quality=0). These MUST be enforced at both the Domain layer (`GenerateVideoRequest`) and the CLI layer. Use `reference_cap_for(model)` and include event-based tripwires in E2E tests.
|
|
25
25
|
|
|
26
|
+
## Command surfaces
|
|
27
|
+
|
|
28
|
+
The `gflow` CLI exposes these command groups (full reference in [docs/USAGE.md](USAGE.md)):
|
|
29
|
+
|
|
30
|
+
- `gflow auth` — one-time Chrome login, status, logout.
|
|
31
|
+
- `gflow image` — `t2i` / `i2i` / `upload` (Imagen / Nano Banana).
|
|
32
|
+
- `gflow video` — `t2v` / `i2v` / `r2v` / `batch`, plus `chain` (last-frame I2V chaining from a JSONL manifest; link 0 is t2v, later links are i2v seeded by the previous clip's last frame; veo models only).
|
|
33
|
+
- `gflow character` — `create` / `list` / `show` / `voices`: reusable, project-scoped Flow Character entities (a named subject with reference images, optional voice and personality) for consistent subjects across generations. See [docs/CHARACTER.md](CHARACTER.md).
|
|
34
|
+
- `gflow scene` — `create` / `show`: compose ordered clips into a scene; `create --output` renders a credit-free server-side extended video via `runVideoFxConcatenation` (no local ffmpeg).
|
|
35
|
+
- `gflow data` — query the local SQLite catalog.
|
|
36
|
+
|
|
26
37
|
## Routing rules
|
|
27
38
|
|
|
28
|
-
- **Starting a feature?** Run `/gflow:
|
|
39
|
+
- **Starting a feature?** Run `/gflow:status` to see the active phase scope, then `/gflow:predict` → `/gflow:scenario` → `/gflow:plan <feature>` to create a task checklist.
|
|
29
40
|
- **Touching auth, reCAPTCHA, browser flow, or anything previously flagged?** Run `/gflow:known-issues` first.
|
|
30
41
|
- **Cutting a release?** Run `/gflow:release` — it sequences `/gflow:changelog`, `/gflow:check`, `/gflow:doc-review`.
|
|
31
42
|
- **Before any commit:** Run `/gflow:check` (or the Impeccable Routine in AGENTS.md), including the documentation link gate.
|