gflow-cli 0.12.0__tar.gz → 0.14.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.12.0 → gflow_cli-0.14.0}/.github/workflows/ci.yml +1 -1
- gflow_cli-0.14.0/.github/workflows/governance-advisory.yml +33 -0
- gflow_cli-0.14.0/.github/workflows/governance-benchmark.yml +29 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/AGENTS.md +1 -1
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/CHANGELOG.md +82 -2
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/PKG-INFO +5 -3
- gflow_cli-0.14.0/PR162_MOVIE_CHARACTER_REVIEW.md +137 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/README.md +3 -1
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/AGENT_GUIDE.md +76 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/CHARACTER.md +8 -9
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/DATA_LAYER.md +0 -2
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/DEVELOPMENT.md +1 -0
- gflow_cli-0.14.0/docs/GOVERNANCE_BENCHMARK.md +107 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/INDEX.md +6 -2
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.12.0.md +8 -6
- gflow_cli-0.14.0/docs/LIVE_VERIFICATION_v0.13.0.md +60 -0
- gflow_cli-0.14.0/docs/MOVIE.md +141 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/PROJECT_STATUS.md +5 -2
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/USAGE.md +31 -15
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/USER_GUIDE.md +8 -7
- gflow_cli-0.14.0/docs/schemas/movie-handoff.schema.json +59 -0
- gflow_cli-0.14.0/docs/superpowers/plans/2026-06-01-governance-enforcement-advisory/PLAN.md +271 -0
- gflow_cli-0.14.0/docs/superpowers/plans/2026-06-04-character-create-recording.md +428 -0
- gflow_cli-0.14.0/docs/superpowers/plans/2026-06-06-movie-p0-asyncio-hotfix.md +223 -0
- gflow_cli-0.14.0/docs/superpowers/plans/2026-06-06-movie-p1-composition-manifest.md +1208 -0
- gflow_cli-0.14.0/docs/superpowers/plans/2026-06-06-movie-p2-native-identity-voice.md +612 -0
- gflow_cli-0.14.0/docs/superpowers/specs/2026-06-06-movie-consistency-design.md +310 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/llms.txt +1 -1
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/pyproject.toml +12 -4
- gflow_cli-0.14.0/scripts/ci/check_materiality.py +192 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/ci/check_repo_hygiene.py +51 -0
- gflow_cli-0.14.0/scripts/dev/_recording_client.py +40 -0
- gflow_cli-0.14.0/scripts/dev/make_project.py +41 -0
- gflow_cli-0.14.0/scripts/dev/materiality_backtest.py +223 -0
- gflow_cli-0.14.0/scripts/dev/patch_character.py +58 -0
- gflow_cli-0.14.0/scripts/dev/record_flow_capture.py +271 -0
- gflow_cli-0.14.0/scripts/dev/spike_movie_attach_payload.py +250 -0
- gflow_cli-0.14.0/scripts/dev/spike_movie_entity_recon.py +190 -0
- gflow_cli-0.14.0/scripts/dev/spike_movie_gen_capture.py +225 -0
- gflow_cli-0.14.0/scripts/dev/spike_movie_picker_select.py +327 -0
- gflow_cli-0.14.0/scripts/dev/spike_movie_voice_list.py +153 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/gflow-cli/SKILL.md +10 -9
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/pr-council-review/SKILL.md +1 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/client.py +76 -29
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/routes.py +24 -3
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/base.py +1 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/ui_automation.py +95 -50
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/ui_automation_video.py +221 -12
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/video.py +16 -4
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli.py +2 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_character.py +80 -0
- gflow_cli-0.14.0/src/gflow_cli/cli_movie.py +747 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_video.py +79 -19
- gflow_cli-0.14.0/src/gflow_cli/composition.py +312 -0
- gflow_cli-0.14.0/src/gflow_cli/movie_manifest.py +480 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/services/character_create.py +5 -5
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tasks/lessons.md +24 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_client.py +32 -0
- gflow_cli-0.14.0/tests/api/test_client_delete_characters.py +52 -0
- gflow_cli-0.14.0/tests/api/test_client_launch_kwargs.py +35 -0
- gflow_cli-0.14.0/tests/api/test_routes_character.py +41 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_video.py +1 -1
- gflow_cli-0.14.0/tests/api/test_video_request.py +48 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_ui_automation_video.py +117 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_character.py +105 -2
- gflow_cli-0.14.0/tests/cli/test_cli_movie.py +906 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_video.py +203 -0
- gflow_cli-0.14.0/tests/cli/test_movie_manifest.py +483 -0
- gflow_cli-0.14.0/tests/composition/test_character.py +43 -0
- gflow_cli-0.14.0/tests/composition/test_compose_prompt.py +93 -0
- gflow_cli-0.14.0/tests/composition/test_handoff.py +134 -0
- gflow_cli-0.14.0/tests/dev/test_record_flow_capture.py +88 -0
- gflow_cli-0.14.0/tests/dev/test_recording_client.py +31 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/conftest.py +13 -4
- gflow_cli-0.14.0/tests/e2e/test_i2v_flags_e2e.py +256 -0
- gflow_cli-0.14.0/tests/scripts/test_check_materiality.py +93 -0
- gflow_cli-0.14.0/tests/scripts/test_check_repo_hygiene.py +51 -0
- gflow_cli-0.14.0/tests/scripts/test_materiality_backtest.py +90 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/uv.lock +207 -25
- gflow_cli-0.12.0/.planning/issue-125-fix.md +0 -207
- gflow_cli-0.12.0/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -38
- gflow_cli-0.12.0/.planning/todos/pending/pr-38-review.md +0 -8
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -319
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -430
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -387
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -2006
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -358
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -2736
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -165
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -34
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -47
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -46
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -89
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -70
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -37
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -33
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -1919
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -70
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -36
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -66
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -70
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -30
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -30
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -57
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -37
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -69
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -20
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -463
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -1449
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -811
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -118
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -697
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -64
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -164
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -2083
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +0 -784
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +0 -632
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +0 -2410
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-22-pr-38-review.md +0 -107
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +0 -1907
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-23-locale-agnostic-selectors.md +0 -108
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-24-data-layer.md +0 -2452
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-30-l0-sapisidhash-aisandbox-auth.md +0 -697
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-31-l0-bearer-pivot.md +0 -97
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-31-l1-scene-compose.md +0 -1480
- gflow_cli-0.12.0/docs/superpowers/plans/2026-05-31-scene-concat-extend.md +0 -100
- gflow_cli-0.12.0/docs/superpowers/plans/2026-06-02-character-creation-phase2.md +0 -293
- gflow_cli-0.12.0/docs/superpowers/plans/2026-06-02-character-creation.md +0 -300
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -484
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -497
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -45
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -190
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -330
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -485
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -87
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -739
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +0 -457
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +0 -40
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +0 -389
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-23-locale-agnostic-selectors.md +0 -66
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-23-readme-v0.8.1-refresh-design.md +0 -359
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-24-data-layer-design.md +0 -403
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-27-public-event-surface-design.md +0 -397
- gflow_cli-0.12.0/docs/superpowers/specs/2026-05-30-add-clip-scene-timeline-design.md +0 -195
- gflow_cli-0.12.0/tests/api/test_routes_character.py +0 -20
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.continue-here.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.env.template +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.gitattributes +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.gitignore +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/.secrets.baseline +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/CLAUDE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/GEMINI.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/LICENSE +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/PLAN.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/RELEASE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/ROADMAP.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docker-compose.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/superpowers/character-scenario.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/diag_capture_flow_traffic.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/diag_recaptcha_mint.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/sonar-project.properties +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_config.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_media.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.14.0}/tests/test_smoke.py +0 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Governance advisory
|
|
2
|
+
|
|
3
|
+
# Non-blocking governance signal: classifies touched paths (material vs routine)
|
|
4
|
+
# and surfaces a recommendation to run /gflow:predict + council review. It NEVER
|
|
5
|
+
# fails the build and is NOT a required check — mirrors the reference AI-DLC
|
|
6
|
+
# orchestrator's advisory-by-default risk gate. Hard enforcement (--block-on +
|
|
7
|
+
# branch protection) is a conscious, documented deferral.
|
|
8
|
+
|
|
9
|
+
on:
|
|
10
|
+
pull_request:
|
|
11
|
+
|
|
12
|
+
# Least privilege: the script writes to $GITHUB_STEP_SUMMARY (no token needed).
|
|
13
|
+
# read-only is sufficient; we do not post comments (which forks cannot do).
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
materiality:
|
|
19
|
+
name: Materiality + traceability (advisory)
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v6
|
|
23
|
+
with:
|
|
24
|
+
fetch-depth: 0 # full history so `git diff origin/<base>..HEAD` resolves
|
|
25
|
+
|
|
26
|
+
- name: Install uv
|
|
27
|
+
uses: astral-sh/setup-uv@v7
|
|
28
|
+
|
|
29
|
+
- name: Classify touched paths (advisory, never blocks)
|
|
30
|
+
run: |
|
|
31
|
+
git fetch --no-tags origin "${{ github.base_ref }}" || true
|
|
32
|
+
uv run python scripts/ci/check_materiality.py \
|
|
33
|
+
--base "origin/${{ github.base_ref }}"
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Governance benchmark
|
|
2
|
+
|
|
3
|
+
# Periodic calibration of the advisory materiality gate. Replays git history and
|
|
4
|
+
# writes the false-positive / coverage report to the job summary. This is a
|
|
5
|
+
# DASHBOARD, not a gate: non-blocking, read-only, no token (fork-safe). See
|
|
6
|
+
# docs/GOVERNANCE_BENCHMARK.md.
|
|
7
|
+
|
|
8
|
+
on:
|
|
9
|
+
schedule:
|
|
10
|
+
- cron: "0 6 1 * *" # 06:00 UTC on the 1st of each month
|
|
11
|
+
workflow_dispatch: # manual run from the Actions tab
|
|
12
|
+
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
backtest:
|
|
18
|
+
name: Materiality gate backtest
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v6
|
|
22
|
+
with:
|
|
23
|
+
fetch-depth: 0 # full history — the backtest replays every commit
|
|
24
|
+
|
|
25
|
+
- name: Install uv
|
|
26
|
+
uses: astral-sh/setup-uv@v7
|
|
27
|
+
|
|
28
|
+
- name: Run backtest (advisory; writes to job summary)
|
|
29
|
+
run: uv run python scripts/dev/materiality_backtest.py >> "$GITHUB_STEP_SUMMARY"
|
|
@@ -9,7 +9,7 @@ Supported tools that auto-discover this file: Cursor, Codex, Aider, Jules, Devin
|
|
|
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
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
|
+
- Command surface: `gflow auth`, `gflow image` (t2i/i2i/upload), `gflow video` (t2v/i2v/r2v/batch/chain), `gflow character` (create/list/show/rm/voices — reusable project-scoped Flow Character entities), `gflow scene` (create/show — Add Clip / Scenes, with `create --output` for credit-free server-side extended video), and `gflow data` (catalog queries).
|
|
13
13
|
- Requires a Google AI Ultra or Pro subscription with Flow access. All generations bill against the user's own Google account.
|
|
14
14
|
|
|
15
15
|
## Headed-browser dependency (architectural reality)
|
|
@@ -7,6 +7,84 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.14.0] — 2026-06-07
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`gflow movie` — multi-scene, character-consistent video generation.** A TOML
|
|
15
|
+
manifest (`gflow movie template` / `gflow movie run`) drives a sequence of clips
|
|
16
|
+
that reuse a single Flow CHARACTER entity (reference-to-video) so the same face
|
|
17
|
+
and voice carry across every scene. Generate-only by default; `--stitch`
|
|
18
|
+
produces an ffmpeg preview concat; runs are crash-resumable via the sibling
|
|
19
|
+
`<manifest>-state.json`; a versioned handoff manifest is written for downstream
|
|
20
|
+
composition (e.g. Remotion). Deterministic prompt assembly (`composition.py`),
|
|
21
|
+
scene = clip.
|
|
22
|
+
- **`docs/MOVIE.md`** — manifest format, the run lifecycle (the headed browser is
|
|
23
|
+
required through generate → poll → download), the character-entity attach
|
|
24
|
+
mechanism, and the best-effort consistency model.
|
|
25
|
+
- Dev utilities: `scripts/dev/make_project.py` (create a Flow project) and
|
|
26
|
+
`scripts/dev/patch_character.py` (rename / set voice + personality on an entity).
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- **R2V character reuse now actually rides the wire.** The entity is attached via
|
|
31
|
+
the resource picker's **Personagens tab → right-click → "Incluir no comando"**
|
|
32
|
+
(which stages `referenceEntities`; a left-click on the Tudo tile only stages the
|
|
33
|
+
thumbnail as a `referenceImage`). The submit backstop now reads the response's
|
|
34
|
+
real `media[].mediaMetadata.requestData.videoGenerationRequestData.videoGenerationEntityInputs`
|
|
35
|
+
path instead of the request-shape `requests[].referenceEntities` — which had
|
|
36
|
+
false-rejected every successful entity generation. `omni-flash` R2V verified to
|
|
37
|
+
carry the entity.
|
|
38
|
+
- Cleared pre-existing type/test debt: `pyright src` is clean again (the missing
|
|
39
|
+
`project_id` parameter was added to the `VideoCapableTransport` protocol and the
|
|
40
|
+
`_enter_editor` type stub); regenerated `uv.lock` (jsonschema dev dependency).
|
|
41
|
+
|
|
42
|
+
## [0.13.0] — 2026-06-04
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
|
|
46
|
+
- **`gflow character rm` — delete a Character entity (#150).**
|
|
47
|
+
`gflow character rm --project <id> (--id <entityId> | --name <name>) [-y/--yes] [--json]`
|
|
48
|
+
deletes a Character via `POST flow:batchDeleteAssets` (Bearer; **FREE** — no
|
|
49
|
+
reCAPTCHA, no credit). Resolves by id or exact name (ambiguous name exits
|
|
50
|
+
**11**); prompts for confirmation unless `--yes`/`--json`.
|
|
51
|
+
|
|
52
|
+
- **In-project governance enforcement (advisory-first).** Made the AI-driven
|
|
53
|
+
development flow followable and partly machine-enforced in-repo, modeled on the
|
|
54
|
+
reference AI-DLC governance orchestrator's advisory-by-default behavior:
|
|
55
|
+
ruff `T20` now bans raw `print()` in `src/`; an advisory branch-naming check and a
|
|
56
|
+
non-blocking materiality + traceability classifier (`scripts/ci/check_materiality.py`
|
|
57
|
+
+ `governance-advisory.yml`) recommend `/gflow:predict` + council review when
|
|
58
|
+
sensitive paths (`auth/`, `api/transports/`, `api/client.py`, `_sapisidhash.py`,
|
|
59
|
+
`data/`, `recaptcha`) are touched, without ever blocking a merge. A
|
|
60
|
+
history-replay backtest (`scripts/dev/materiality_backtest.py`) calibrates the
|
|
61
|
+
gate — it measured a 1.1% false-positive rate (vs. a 20-30% estimate) and
|
|
62
|
+
raised fix-coverage from 61% to 74% by surfacing auth-token plumbing that lived
|
|
63
|
+
outside `auth/`. The backtest is a first-class, repeatable artifact (`--json`
|
|
64
|
+
mode, a monthly `governance-benchmark.yml` dashboard job) fully documented in
|
|
65
|
+
[`docs/GOVERNANCE_BENCHMARK.md`](docs/GOVERNANCE_BENCHMARK.md); the gate itself is
|
|
66
|
+
described in
|
|
67
|
+
[`docs/AGENT_GUIDE.md` § Governance & Enforcement](docs/AGENT_GUIDE.md#governance--enforcement).
|
|
68
|
+
|
|
69
|
+
### Changed
|
|
70
|
+
|
|
71
|
+
- **`gflow video i2v` frame flags aligned with Flow UI terminology (#122).**
|
|
72
|
+
`--initial-frame FILE` is the new canonical flag for the start image (matches
|
|
73
|
+
Flow's "initial frame" label). `--end-frame FILE` replaces `--end-image` as the
|
|
74
|
+
canonical end-frame flag. `--end-image` is kept as a **deprecated alias** (emits
|
|
75
|
+
`DeprecationWarning`; will be removed in a future minor release). The positional
|
|
76
|
+
`IMAGE` argument remains supported for back-compatibility.
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
|
|
80
|
+
- **Character editor 404 on non-English locales (#153).** `gflow character`'s
|
|
81
|
+
editor URL interpolated the locale verbatim, so the genuine default BCP-47
|
|
82
|
+
`en-US` produced `/fx/en-US/…`, which 404s the Flow character editor (only the
|
|
83
|
+
short primary subtag is a valid `/fx/<seg>/` segment). `character_editor_url`
|
|
84
|
+
now normalizes a BCP-47 tag to its lower-cased short segment (`en-US → en`,
|
|
85
|
+
`pt-BR → pt`), so the tool stays language-agnostic with the real default
|
|
86
|
+
locale.
|
|
87
|
+
|
|
10
88
|
## [0.12.0] — 2026-06-03
|
|
11
89
|
|
|
12
90
|
### Fixed
|
|
@@ -644,7 +722,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
644
722
|
- `gflow image batch` now actually shares one Flow project across all
|
|
645
723
|
prompts in a batch. Previously the `--same-project=1` flag was a no-op
|
|
646
724
|
at the `ui_automation` transport layer; each prompt landed in its own
|
|
647
|
-
Flow project.
|
|
725
|
+
Flow project.
|
|
648
726
|
- `gflow image t2i -n N` now makes one transport call using Flow's native
|
|
649
727
|
xN count selector instead of fanning out N parallel single-image
|
|
650
728
|
submissions. Closes [#14](https://github.com/ffroliva/gflow-cli/issues/14) part 1.
|
|
@@ -1356,7 +1434,9 @@ shell-script template that branches on these codes.
|
|
|
1356
1434
|
|
|
1357
1435
|
First skeleton. Not functional end-to-end yet.
|
|
1358
1436
|
|
|
1359
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1437
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.14.0...HEAD
|
|
1438
|
+
[0.14.0]: https://github.com/ffroliva/gflow-cli/compare/v0.13.0...v0.14.0
|
|
1439
|
+
[0.13.0]: https://github.com/ffroliva/gflow-cli/compare/v0.12.0...v0.13.0
|
|
1360
1440
|
[0.12.0]: https://github.com/ffroliva/gflow-cli/compare/v0.11.0...v0.12.0
|
|
1361
1441
|
[0.11.0]: https://github.com/ffroliva/gflow-cli/compare/v0.10.0...v0.11.0
|
|
1362
1442
|
[0.10.0]: https://github.com/ffroliva/gflow-cli/compare/v0.9.1...v0.10.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.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
|
|
@@ -53,7 +53,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
|
53
53
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
54
54
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
55
55
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
56
|
-
Requires-Dist: ruff>=0.
|
|
56
|
+
Requires-Dist: ruff>=0.15.15; extra == 'dev'
|
|
57
57
|
Provides-Extra: gcs
|
|
58
58
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
59
59
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
@@ -81,6 +81,7 @@ Description-Content-Type: text/markdown
|
|
|
81
81
|
>
|
|
82
82
|
> 🌐 **Headed-browser today.** gflow drives Flow via a persistent Playwright Chromium profile — Google's auth + reCAPTCHA gates currently require it. See [Architecture & current limitations](#architecture--current-limitations) for the contributor opportunity.
|
|
83
83
|
|
|
84
|
+
|
|
84
85
|
## Why gflow-cli?
|
|
85
86
|
|
|
86
87
|
For Google AI Ultra / Pro subscribers with Veo credits and batch workloads:
|
|
@@ -141,10 +142,11 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
|
|
|
141
142
|
| **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
|
|
142
143
|
| 🎭 **Characters** | [Characters](docs/CHARACTER.md) — reusable subjects (`gflow character`) |
|
|
143
144
|
| 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
|
|
144
|
-
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
145
|
+
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
145
146
|
| 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
|
|
146
147
|
| 🤝 **Contributing** | [Contributing](CONTRIBUTING.md) · [Development](docs/DEVELOPMENT.md) · [GitHub workflow](docs/GITHUB.md) |
|
|
147
148
|
|
|
149
|
+
|
|
148
150
|
## For AI agents & LLMs
|
|
149
151
|
|
|
150
152
|
gflow-cli ships three agent entry points — pick the one your tool reads first.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# PR #162 Review — Movie Orchestration Character Consistency
|
|
2
|
+
|
|
3
|
+
**Branch:** `pr162` · **Scope:** `gflow movie` orchestrator (`cli_movie.py`, `movie_manifest.py`) + video transport
|
|
4
|
+
**Verdict:** Sound foundation, correct project consolidation, but the headline goal (consistent character) is **not achievable with the current r2v-by-uploaded-image approach** — and there is a **release-blocking `NameError` that aborts every multi-scene run after scene 1.**
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## TL;DR
|
|
9
|
+
|
|
10
|
+
| # | Objective | Finding |
|
|
11
|
+
|---|-----------|---------|
|
|
12
|
+
| 0 | *(not in brief)* | 🔴 **CRITICAL** — `asyncio.sleep(5)` at `cli_movie.py:344` with **no `import asyncio`** → `NameError` on the 2nd scene of every movie, outside the try/except → whole run aborts after 1 scene. |
|
|
13
|
+
| 1 | Native character integration | ✅ **Feasible & protocol-ready.** Flow's wire has a native field `referenceEntities:[{entityId}]` on `video:batchAsyncGenerateVideoReferenceImages` (live-verified, `docs/CHARACTER.md §6.6/§8`). The entity_id is *already saved* in state but never used. Needs a new transport path (composer resource-picker → "Personagens") + DTO field. |
|
|
14
|
+
| 2 | r2v vs i2v / chain | ✅ The chaining engine **already exists** (`chain.py`, `media.extract_last_frame`, `gflow video chain`). It's just not wired into `movie.toml`. r2v+entity = identity; i2v-chain = motion continuity; **mutually exclusive per generation** (DTO enforces frames XOR references). |
|
|
15
|
+
| 3 | Project consolidation | ✅ **Correct and it's the enabler.** `manifest.project` is threaded to character-create *and* every scene; `_enter_editor` deep-links to that project. This is exactly the precondition that makes native `referenceEntities` selection possible. |
|
|
16
|
+
| 4 | Error handling (`generate_resp`/403) | ✅ **Already fixed.** `generate_resp={}` bound before `try` (`:1421`); 403→`WafRejectionError`, silent→`TimeoutError`; listeners freed in `finally`. No UnboundLocal remains. |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 0. 🔴 CRITICAL — `asyncio` is not imported (multi-scene runs crash)
|
|
21
|
+
|
|
22
|
+
`cli_movie.py:342-345`:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
# reCAPTCHA cooldown
|
|
26
|
+
if completed_scene_ids:
|
|
27
|
+
await asyncio.sleep(5) # NameError: name 'asyncio' is not defined
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- `asyncio` appears **exactly once** in the file (the usage); it is **not** in the import block (`:17-44`).
|
|
31
|
+
- `completed_scene_ids` is non-empty from the 2nd scene onward (appended at `:373`, and on resume at `:332`).
|
|
32
|
+
- The call sits **outside** the per-scene `try/except` (`try` starts at `:346`), so the `NameError` propagates out of `_run_movie` → caught by `run_with_handlers` → **the entire movie aborts after exactly one scene**, regardless of `--continue-on-error`.
|
|
33
|
+
- On *resume* it's worse: the first already-completed scene appends to `completed_scene_ids`, so the very first new scene hits the cooldown and crashes → **resume can make zero forward progress.**
|
|
34
|
+
|
|
35
|
+
**Why it escaped CI:** the only async-orchestrator test (`tests/cli/test_cli_movie.py:368 test_happy_path_no_characters`) uses a **single** scene. No test drives `_run_movie` with ≥2 scenes, so the cooldown branch is never executed. (The `out/stickman-v3/` artifacts predate this regression — file mtime is later than the renders.)
|
|
36
|
+
|
|
37
|
+
**Fix (one line):** add `import asyncio` to the import block. **Then add a 2-scene orchestrator test** so this can't regress (see §6).
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 1. Native character integration — the real fix for divergence
|
|
42
|
+
|
|
43
|
+
### Current behaviour (confirms the brief)
|
|
44
|
+
- `character_create` downloads face/body to **local disk**; `CharacterState` stores both `entity_id` *and* `image_paths` (`cli_movie.py:454-457`).
|
|
45
|
+
- `_collect_refs` (`cli_movie.py:470-483`) returns **only `image_paths`** for r2v. `entity_id` is captured and then ignored.
|
|
46
|
+
- `_generate_scene` passes those local paths as `reference_images`; the transport's `_attach_references` (`ui_automation_video.py:1092`) **re-uploads each file** via the "Add Media" dialog → fresh media IDs every scene → Flow sees unrelated assets → the Stickman drifts. **Exactly the diagnosed flaw.**
|
|
47
|
+
|
|
48
|
+
### The native path exists and is verified
|
|
49
|
+
From `docs/CHARACTER.md §6.6` (live-verified 2026-06-02, `labs.google23.har`):
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
"video:batchAsyncGenerateVideoReferenceImages" → {
|
|
53
|
+
"referenceImages": [ { "mediaId", "imageUsageType":"IMAGE_USAGE_TYPE_ASSET" } ],
|
|
54
|
+
"referenceEntities": [ { "entityId" } ] // ← native character identity
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- `referenceEntities` is a **list** → multi-character per scene (`VIDEO_MODEL_CAPABILITY_MULTI_REFERENCE`).
|
|
59
|
+
- UI flow: composer → resource picker (*"Pesquisar recursos"*) → **Personagens** tab → select → **"Incluir no comando"** → injects `referenceEntities`.
|
|
60
|
+
- CLI `gflow video … --character <id>` is documented **backlog Phase 3 — unimplemented** (`docs/CHARACTER.md §8`). So this is *new automation*, not a refactor of existing code.
|
|
61
|
+
|
|
62
|
+
### Proposed refactor
|
|
63
|
+
|
|
64
|
+
**(a) DTO** — `api/video.py`, `GenerateVideoRequest`:
|
|
65
|
+
```python
|
|
66
|
+
reference_entities: tuple[str, ...] = () # R2V — Flow CHARACTER entity ids
|
|
67
|
+
```
|
|
68
|
+
⚠️ Relax `__post_init__`: today R2V **requires** `reference_images` (`video.py:249-252`). Change to *require `reference_images` **or** `reference_entities`* (either anchors the clip). Keep frames XOR references.
|
|
69
|
+
|
|
70
|
+
**(b) Transport** — new `_attach_character_entities(page, names, out_dir)` that, in `references` sub-mode, opens the resource picker, switches to the Characters/"Personagens" tab, selects each character **by display name**, clicks "Include in prompt". In `_generate_video_locked` R2V branch (`:1406`): if `request.reference_entities` → use entity attach; else fall back to `_attach_references`. (Both *may* coexist per the wire.)
|
|
71
|
+
- **Defense-in-depth (mirror the #125 backstop):** after submit, assert the captured generate payload's `referenceEntities` contains the expected `entityId`; if it's missing, raise rather than report a false success — otherwise an entity that silently failed to attach degrades to a plain text-only clip with no warning.
|
|
72
|
+
|
|
73
|
+
**(c) Orchestrator** — `_collect_refs` → return entity refs when `CharacterState.entity_id` is present, image paths only as fallback. Pass `reference_entities=(...entity_ids...)` into `GenerateVideoRequest`. Selection is **by name** (what the picker shows); `entity_id` is the verification key. No `movie.toml` change needed — `characters = ["Stickman"]` already names them; the orchestrator maps name→entity_id from state.
|
|
74
|
+
|
|
75
|
+
**(d) Pre-flight guard** — before the scene loop, verify each named entity actually exists in the project (`client.get_character(entity_id=...)`). Currently `_collect_refs` silently **drops** a missing character (`log.warning` + `continue`, `:478`) → the scene generates with **no refs at all** → guaranteed divergence with no hard failure. Fail loud instead.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 2. r2v vs i2v for journey continuity — the chain engine already exists
|
|
80
|
+
|
|
81
|
+
**Key constraint:** R2V "references" and I2V "frames" are **separate, mutually-exclusive composer sub-modes** (`_switch_video_sub_mode`, `:903`) and the DTO enforces it (`video.py:245-252`). You **cannot** have character-entity identity *and* a seeded start-frame in the *same* generation.
|
|
82
|
+
|
|
83
|
+
What each buys you:
|
|
84
|
+
- **r2v + `referenceEntities`** → strong **identity** consistency per clip; hard cuts between scenes.
|
|
85
|
+
- **i2v chain** (scene N+1 start = scene N's last frame) → **motion/visual continuity**; but link 0 has no identity anchor and identity drifts frame-to-frame.
|
|
86
|
+
|
|
87
|
+
**You already have the chain machinery** — it's just not exposed in `movie.toml`:
|
|
88
|
+
- `media.extract_last_frame(src, dst, *, offset_ms=0)` (`media.py:31`)
|
|
89
|
+
- `chain.run_chain(...)` + `ChainLinkSpec`/`ChainLinkResult`/`FrameExtractor` protocols (`chain.py:74-185`) — record-before-extract, crash-resumable.
|
|
90
|
+
- `chain_repo.ChainLinkRecorder` + migration `0005_add_chain_links.sql`.
|
|
91
|
+
- `gflow video chain` (`cli_video.py:324 _run_chain`): "link 0 as T2V, every later link as I2V seeded by the previous clip's last frame."
|
|
92
|
+
|
|
93
|
+
**Recommendation:** add an opt-in chain mode to `movie.toml` that routes through the existing `chain.run_chain()` rather than reimplementing it (e.g. top-level `mode = "chain"`, or scene-level `chain_from = "<previous scene title>"`). Then give honest guidance in docs:
|
|
94
|
+
|
|
95
|
+
> For a **journey where the character must stay the same**, prefer **r2v + native character** on *every* scene (each clip independently anchored to the entity → best identity, accepts cuts). Use **chain** when smooth motion handoff matters more than identity, accepting drift. They can be mixed per-scene but never combined within one clip.
|
|
96
|
+
|
|
97
|
+
The strongest practical journey today = r2v+entity on each scene; chaining is complementary, not a substitute, for the *consistency* goal specifically.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 3. Project consolidation — verified, and it's load-bearing
|
|
102
|
+
|
|
103
|
+
`manifest.project` (single value) is passed to `_create_character(project_id=…)` (`:309`) **and** `_generate_scene(project_id=…)` (`:356`); `_enter_editor` deep-links via `routes.project_editor_url(locale, project_id)` → `page.goto` (`ui_automation.py:815-818`); characters are created at the project's character-editor URL (`:2275`). So every character and every scene live in **one** project. ✅
|
|
104
|
+
|
|
105
|
+
This is precisely why the native-character refactor (§1) works: the entity must be in the **active** project to appear in the composer's "Personagens" picker. The consolidation you added is the enabler — keep it, and add the §1(d) guard so a missing entity fails loudly instead of silently degrading.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 4. Error handling (`generate_resp` / `responses` / 403) — already correct
|
|
110
|
+
|
|
111
|
+
- `generate_resp: dict[str, Any] = {}` is bound **before** the `try` (`ui_automation_video.py:1421`) → no access-before-assignment on any failure path.
|
|
112
|
+
- `_await_generate_response` raises a clear `TimeoutError` when reCAPTCHA fails *silently* (no response captured, `:1172-1179`).
|
|
113
|
+
- `_parse_generate_response` maps **401→`AuthExpiredError`**, **403→`WafRejectionError`**, other non-200→`WireFormatError` (`:1245-1262`).
|
|
114
|
+
- Both response listeners are removed in `finally` (`:1484-1488`); `generate_handler`/`status_handler` are bound before the `try`.
|
|
115
|
+
- `responses` only appears in comments — no live variable by that name. **No remaining UnboundLocal/TypeError on the 403 path.** Nothing to fix here.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## 5. Other observations (non-blocking)
|
|
120
|
+
|
|
121
|
+
- **Dry-run vs reality mismatch:** the plan prints `refs=[<names>]` (`:260`) but r2v actually consumes image *paths*; after §1 this becomes accurate again (names = entities). Minor.
|
|
122
|
+
- `CharacterState`/`SceneState` are non-frozen dataclasses — intentional (mutated in place); fine.
|
|
123
|
+
- Summary stitch hint uses `flow_operation_id or media_id` (`:371`) — good.
|
|
124
|
+
|
|
125
|
+
## 6. Testing gap (ties to the DoD: "full e2e covering all scenarios")
|
|
126
|
+
|
|
127
|
+
- No test drives `_run_movie` with **≥2 scenes** → the cooldown/`asyncio` path and the resume-append path are unexercised. Add: a 2-scene happy path (mock `_generate_scene`) that would have caught §0, and a resume test (one scene pre-completed in state).
|
|
128
|
+
- Add a unit test asserting `_collect_refs` (post-refactor) returns entity ids when present, and a transport test asserting `referenceEntities` lands in the captured payload.
|
|
129
|
+
- Per project DoD memory, a movie feature isn't done until a live e2e covers happy + all error/exit paths on a real project.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Suggested sequencing
|
|
134
|
+
|
|
135
|
+
1. **Hotfix now:** `import asyncio` + 2-scene orchestrator test. (Unblocks the feature as-is, even with uploaded-image refs.)
|
|
136
|
+
2. **Identity fix:** DTO `reference_entities` + validation relax + transport entity-attach + payload backstop + orchestrator wiring + missing-entity guard.
|
|
137
|
+
3. **Journey mode (opt-in):** wire `movie.toml` → existing `chain.run_chain()`; document the identity-vs-continuity tradeoff.
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
>
|
|
18
18
|
> 🌐 **Headed-browser today.** gflow drives Flow via a persistent Playwright Chromium profile — Google's auth + reCAPTCHA gates currently require it. See [Architecture & current limitations](#architecture--current-limitations) for the contributor opportunity.
|
|
19
19
|
|
|
20
|
+
|
|
20
21
|
## Why gflow-cli?
|
|
21
22
|
|
|
22
23
|
For Google AI Ultra / Pro subscribers with Veo credits and batch workloads:
|
|
@@ -77,10 +78,11 @@ Reproduce the recording: [`scripts/record_demo.ps1`](scripts/record_demo.ps1) (W
|
|
|
77
78
|
| **Storage & catalog** | [External Storage](docs/EXTERNAL_STORAGE.md) · [Data Layer](docs/DATA_LAYER.md) |
|
|
78
79
|
| 🎭 **Characters** | [Characters](docs/CHARACTER.md) — reusable subjects (`gflow character`) |
|
|
79
80
|
| 🔐 **Auth & sessions** | [Authentication](docs/AUTHENTICATION.md) · [Known issues](KNOWN_ISSUES.md) |
|
|
80
|
-
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
81
|
+
| 🏗️ **Internals** | [Architecture](docs/ARCHITECTURE.md) · [Security](docs/SECURITY.md) · [Debugging](docs/DEBUGGING.md) |
|
|
81
82
|
| 📦 **Releases** | [Changelog](CHANGELOG.md) · [Roadmap](ROADMAP.md) · [Release protocol](RELEASE.md) · [Project status](docs/PROJECT_STATUS.md) |
|
|
82
83
|
| 🤝 **Contributing** | [Contributing](CONTRIBUTING.md) · [Development](docs/DEVELOPMENT.md) · [GitHub workflow](docs/GITHUB.md) |
|
|
83
84
|
|
|
85
|
+
|
|
84
86
|
## For AI agents & LLMs
|
|
85
87
|
|
|
86
88
|
gflow-cli ships three agent entry points — pick the one your tool reads first.
|
|
@@ -53,6 +53,82 @@ Before merge, verify each item and record the evidence in the PR or final handof
|
|
|
53
53
|
- **Git hygiene is clean:** branch targets `develop`, unrelated local changes are not included, commit messages contain no AI attribution, and generated artefacts stay out of git.
|
|
54
54
|
- **Memory is updated:** durable project rules or operational lessons are written to agent memory before closing the work.
|
|
55
55
|
|
|
56
|
+
## Governance & Enforcement
|
|
57
|
+
|
|
58
|
+
gflow-cli's AI-driven development flow is **followable in-repo**: the lifecycle is
|
|
59
|
+
documented here, and the rules that *can* be checked mechanically are. The model is
|
|
60
|
+
**advisory-first** — cheap, deterministic rules are hard-enforced; the
|
|
61
|
+
judgement-heavy gates (predict / council) are surfaced as non-blocking signals, not
|
|
62
|
+
gates you can game. (Patterned on the reference AI-DLC governance orchestrator, which
|
|
63
|
+
classifies-always but blocks only on an opt-in flag.)
|
|
64
|
+
|
|
65
|
+
### The lifecycle
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
/gflow:predict → /gflow:scenario → /gflow:plan → (implement) →
|
|
69
|
+
/gflow:branch-review or /gflow:pr-council-review → /gflow:check → /gflow:release
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Skip predict/scenario/plan for trivial fixes (< 10 lines, no boundary cross) and pure
|
|
73
|
+
doc changes. Everything else: assess before you build.
|
|
74
|
+
|
|
75
|
+
### What is hard-enforced vs advisory
|
|
76
|
+
|
|
77
|
+
| Rule | Enforced by | Type |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| No `print()` in `src/` | ruff `T20` (`tests/**`, `scripts/**` exempt) | **hard** (CI lint) |
|
|
80
|
+
| Doc links resolve | `scripts/ci/check_doc_links.py` | **hard** (CI) |
|
|
81
|
+
| No tracked artefacts / hardcoded paths | `scripts/ci/check_repo_hygiene.py` | **hard** (CI + pre-commit) |
|
|
82
|
+
| Coverage ≥ 80% | `pytest --cov-fail-under` / SonarCloud | **hard** (CI) |
|
|
83
|
+
| Signed tags | release workflow | **hard** (CI) |
|
|
84
|
+
| Material-path list ↔ SKILL §1 in sync | `test_material_list_sync_passes_on_real_skill` | **hard** (CI) |
|
|
85
|
+
| Conventional branch prefix | `check_repo_hygiene.py::_check_branch_name` | **advisory** (warns; never blocks — platforms create `claude/*` / `dependabot/*` branches, and it no-ops in CI's detached-HEAD checkout) |
|
|
86
|
+
| predict / council on material paths | `governance-advisory.yml` + `check_materiality.py` | **advisory** (recommendation in the job summary) |
|
|
87
|
+
| Traceability (plan reference + tests) | `check_materiality.py` | **advisory** (report-only) |
|
|
88
|
+
|
|
89
|
+
### Materiality coverage (path → recommended gate)
|
|
90
|
+
|
|
91
|
+
Touching these surfaces triggers an advisory recommendation to run predict + council.
|
|
92
|
+
The canonical list is `scripts/ci/check_materiality.py::MATERIAL_PATHS`; the priority
|
|
93
|
+
weights live in [`skills/pr-council-review/SKILL.md`](../skills/pr-council-review/SKILL.md) §1.
|
|
94
|
+
|
|
95
|
+
| Path | Why material | Recommended gate |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| `src/gflow_cli/auth/`, `recaptcha` | Google anti-bot / auth lifecycle | predict (security persona) + council |
|
|
98
|
+
| `src/gflow_cli/api/client.py`, `_sapisidhash.py` | Auth-token plumbing (Bearer / access-token / SAPISID) outside `auth/`; surfaced as a coverage gap by `scripts/dev/materiality_backtest.py` (3 historical fixes) | predict (security persona) + council |
|
|
99
|
+
| `src/gflow_cli/api/transports/` | Highest-risk transport surface; live-verify | predict + council (live-verify) |
|
|
100
|
+
| `src/gflow_cli/data/` | SQLite migration / data-loss risk | predict + council (migration safety) |
|
|
101
|
+
|
|
102
|
+
### Non-blocking signals
|
|
103
|
+
|
|
104
|
+
The materiality and traceability surfaces are **informational only** — they never fail
|
|
105
|
+
the build and are not required checks. They guide behaviour; only the hard gates above
|
|
106
|
+
block a merge. Do not read the advisory job's red/green as a merge gate.
|
|
107
|
+
|
|
108
|
+
### Calibrating the gate (is it worth the friction?)
|
|
109
|
+
|
|
110
|
+
The material-path list is **measured, not asserted**.
|
|
111
|
+
[`docs/GOVERNANCE_BENCHMARK.md`](GOVERNANCE_BENCHMARK.md) documents a history-replay
|
|
112
|
+
backtest (`scripts/dev/materiality_backtest.py`) that scores the gate on two axes —
|
|
113
|
+
false-positive friction and fix-coverage — and the loop for acting on the numbers.
|
|
114
|
+
Current baseline: **1.1% false positives, 73.7% fix-coverage**. Re-run it before
|
|
115
|
+
changing `MATERIAL_PATHS`.
|
|
116
|
+
|
|
117
|
+
### Conscious deferral
|
|
118
|
+
|
|
119
|
+
Hard enforcement of the material-path gate (an opt-in `--block-on=material` flag plus a
|
|
120
|
+
branch-protection required check) is **deliberately deferred**, matching the reference
|
|
121
|
+
implementation's opt-in design — it is a future option, not an omission. The hook point
|
|
122
|
+
is reserved in `check_materiality.py` (which already classifies every change).
|
|
123
|
+
|
|
124
|
+
### Satisfying a gate without Claude Code
|
|
125
|
+
|
|
126
|
+
Every gate enforces a **deliverable**, not a Claude-specific command. Non-Claude agents
|
|
127
|
+
(Cursor / Codex / Gemini CLI / Aider) and humans read the relevant `skills/<name>/SKILL.md`
|
|
128
|
+
directly and produce the same artifact — e.g. read `skills/predict/SKILL.md` and write the
|
|
129
|
+
5-persona verdict into the PR, instead of running `/gflow:predict`.
|
|
130
|
+
|
|
56
131
|
## When in doubt
|
|
57
132
|
|
|
133
|
+
|
|
58
134
|
Read [docs/INDEX.md](INDEX.md). It has a topic-shortcut block at the bottom that answers most "where do I find…?" questions in one hop.
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
> built **greenfield off `develop`, NOT stacked on #123** (that branch is CONFLICTING and likeness-specific;
|
|
9
9
|
> see [Design decisions](#11-design-decisions-post-predict)).
|
|
10
10
|
|
|
11
|
-
> **Shipped scope:** `gflow character create` + `list` + `show` + `voices`. The reuse path
|
|
12
|
-
> `gflow video --character` (Phase 3)
|
|
11
|
+
> **Shipped scope:** `gflow character create` + `list` + `show` + `voices` + `rm`. The reuse path
|
|
12
|
+
> `gflow video --character` (Phase 3) and `gflow image --character` are **not yet
|
|
13
13
|
> implemented** — see [Backlog](#14-backlog--not-yet-implemented).
|
|
14
14
|
|
|
15
15
|
> **Status (2026-06-02, LIVE-VERIFIED):** the create saga + character-editor UI generation are **shipped**
|
|
@@ -260,8 +260,8 @@ both normalize to the canonical `Charon`) and sets `audioReferences[].presetVoic
|
|
|
260
260
|
The `create` / `list` / `show` / `voices` commands below are **shipped and
|
|
261
261
|
live-verified in v0.12.0** (the user-facing reference lives in
|
|
262
262
|
[USAGE § `gflow character`](USAGE.md#gflow-character)). The `gflow video --character`
|
|
263
|
-
reuse path
|
|
264
|
-
**
|
|
263
|
+
reuse path and `gflow image --character` remain **backlog** (rows marked *not
|
|
264
|
+
yet implemented*). `gflow character rm` is **shipped** (see the table below).
|
|
265
265
|
|
|
266
266
|
| Command | Maps to |
|
|
267
267
|
|---|---|
|
|
@@ -270,7 +270,7 @@ reuse path, `gflow image --character`, and `gflow character rm` remain
|
|
|
270
270
|
| `gflow character show --project <id> (--id <entityId> \| --name <displayName>) [--json]` *(SHIPPED v0.12.0)* | projectInitialData (single); name collision → exit 11 with disambiguation hint |
|
|
271
271
|
| `gflow character voices [--json]` *(SHIPPED v0.12.0)* | list the 29 preset voices (name / description / sample-url); language-agnostic discovery, mirrors `gflow models --json` |
|
|
272
272
|
| `gflow video … --character <id>` *(repeatable → multi-ref)* | **not yet implemented** (Phase 3) — `referenceEntities` on `video:batchAsyncGenerateVideoReferenceImages` |
|
|
273
|
-
| `gflow character rm
|
|
273
|
+
| `gflow character rm` (`--id`/`--name`) | **Shipped v0.13.0 (#150)** — `POST flow:batchDeleteAssets` (Bearer; FREE — no reCAPTCHA/credit) |
|
|
274
274
|
| `gflow image … --character <id>` | **not yet implemented** — image-path `referenceEntities` uncaptured |
|
|
275
275
|
|
|
276
276
|
All commands take **`--project <id>` (required)** — every endpoint (`createEntity`, `projectInitialData`,
|
|
@@ -305,7 +305,7 @@ never hard-code wire names in user-facing help — see [[cli-model-aliases-verif
|
|
|
305
305
|
## 10. Open items
|
|
306
306
|
|
|
307
307
|
See [§14 Backlog — not yet implemented](#14-backlog--not-yet-implemented) for the consolidated list. In
|
|
308
|
-
short: `gflow video --character` reuse (Phase 3), `gflow image --character`,
|
|
308
|
+
short: `gflow video --character` reuse (Phase 3), `gflow image --character`, live voice
|
|
309
309
|
listing + `presetVoiceId` wire-case confirmation, custom-voice creation, `nanopro` picker live confirmation,
|
|
310
310
|
and extra body angles. The optional creation-agent (`flowCreationAgent/sessions`,
|
|
311
311
|
`flow.generateCharacterPrompt` archetypes) is not required for the scripted path; consider an `--archetype`
|
|
@@ -495,9 +495,8 @@ The following are explicitly **out of the shipped scope** and tracked for future
|
|
|
495
495
|
- **Extra body angles beyond the built-in triptych.** The shipped body slot generates a single front/side/back
|
|
496
496
|
triptych. Generating additional angles/poses (e.g. re-feeding the front view as a reference seed for a new
|
|
497
497
|
slot) is a future enhancement.
|
|
498
|
-
- **`gflow
|
|
499
|
-
|
|
500
|
-
reverse-engineered.
|
|
498
|
+
- **`gflow image --character`.** The **image-path** reuse (`referenceEntities` on the image endpoint) is
|
|
499
|
+
uncaptured — deferred until its wire shape is reverse-engineered. (`gflow character rm` is now shipped, #150.)
|
|
501
500
|
- **Set the Flow editor title field** so the editor isn't "Untitled Character" (see [§13.1 Known issues](#131-known-issues)).
|
|
502
501
|
Investigate either the UI title box (with a Ctrl+A merge-bug workaround) or finding the dedicated title
|
|
503
502
|
field/endpoint that the editor widget reads from, distinct from `entityInfo.displayName`.
|
|
@@ -456,8 +456,6 @@ These are tracked in [`PLAN.md`](../PLAN.md) under the data-layer phase backlog.
|
|
|
456
456
|
|
|
457
457
|
## See also
|
|
458
458
|
|
|
459
|
-
- [Spec](superpowers/specs/2026-05-24-data-layer-design.md) — original design document with goals, non-goals, and architectural rationale.
|
|
460
|
-
- [Plan](superpowers/plans/2026-05-24-data-layer.md) — task-by-task implementation plan.
|
|
461
459
|
- [`CONFIGURATION.md`](CONFIGURATION.md) — env-var reference.
|
|
462
460
|
- [`EXTERNAL_STORAGE.md`](EXTERNAL_STORAGE.md) — S3, MinIO, and GCS output configuration.
|
|
463
461
|
- [`USAGE.md`](USAGE.md) — `gflow data media` command reference.
|
|
@@ -131,6 +131,7 @@ This repo is actively developed with Claude Code (see [CLAUDE.md](../CLAUDE.md))
|
|
|
131
131
|
## See also
|
|
132
132
|
|
|
133
133
|
- [CONTRIBUTING.md](../CONTRIBUTING.md) — TDD, quality gates, how to add a route, commit style
|
|
134
|
+
- [docs/GOVERNANCE_BENCHMARK.md](GOVERNANCE_BENCHMARK.md) — calibrating the advisory materiality gate (false-positive / coverage backtest)
|
|
134
135
|
- [docs/GITHUB.md](GITHUB.md) — GitHub PR triage, external fork handling, SonarCloud scenarios
|
|
135
136
|
- [RELEASE.md](../RELEASE.md) — release checklist, PyPI/GitHub publishing, tag protocol
|
|
136
137
|
- [CHANGELOG.md](../CHANGELOG.md) — version history
|