gflow-cli 0.12.0__tar.gz → 0.13.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.13.0}/.github/workflows/ci.yml +1 -1
- gflow_cli-0.13.0/.github/workflows/governance-advisory.yml +33 -0
- gflow_cli-0.13.0/.github/workflows/governance-benchmark.yml +29 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/AGENTS.md +1 -1
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/CHANGELOG.md +49 -2
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/PKG-INFO +5 -3
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/README.md +3 -1
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/AGENT_GUIDE.md +76 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/CHARACTER.md +8 -9
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/DATA_LAYER.md +0 -2
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/DEVELOPMENT.md +1 -0
- gflow_cli-0.13.0/docs/GOVERNANCE_BENCHMARK.md +107 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/INDEX.md +5 -2
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.12.0.md +8 -6
- gflow_cli-0.13.0/docs/LIVE_VERIFICATION_v0.13.0.md +60 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/PROJECT_STATUS.md +5 -2
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/USAGE.md +31 -15
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/USER_GUIDE.md +8 -7
- gflow_cli-0.13.0/docs/superpowers/plans/2026-06-01-governance-enforcement-advisory/PLAN.md +271 -0
- gflow_cli-0.13.0/docs/superpowers/plans/2026-06-04-character-create-recording.md +428 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/llms.txt +1 -1
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/pyproject.toml +11 -4
- gflow_cli-0.13.0/scripts/ci/check_materiality.py +192 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/ci/check_repo_hygiene.py +51 -0
- gflow_cli-0.13.0/scripts/dev/_recording_client.py +40 -0
- gflow_cli-0.13.0/scripts/dev/materiality_backtest.py +223 -0
- gflow_cli-0.13.0/scripts/dev/record_flow_capture.py +271 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/gflow-cli/SKILL.md +10 -9
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/pr-council-review/SKILL.md +1 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/client.py +72 -29
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/routes.py +15 -3
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_character.py +80 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_video.py +79 -19
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/services/character_create.py +5 -5
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_client.py +31 -0
- gflow_cli-0.13.0/tests/api/test_client_delete_characters.py +52 -0
- gflow_cli-0.13.0/tests/api/test_client_launch_kwargs.py +35 -0
- gflow_cli-0.13.0/tests/api/test_routes_character.py +41 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_character.py +105 -2
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_video.py +203 -0
- gflow_cli-0.13.0/tests/dev/test_record_flow_capture.py +88 -0
- gflow_cli-0.13.0/tests/dev/test_recording_client.py +31 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/conftest.py +13 -4
- gflow_cli-0.13.0/tests/e2e/test_i2v_flags_e2e.py +256 -0
- gflow_cli-0.13.0/tests/scripts/test_check_materiality.py +93 -0
- gflow_cli-0.13.0/tests/scripts/test_check_repo_hygiene.py +51 -0
- gflow_cli-0.13.0/tests/scripts/test_materiality_backtest.py +90 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/uv.lock +24 -24
- 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.13.0}/.claude/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.continue-here.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.env.template +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.gitattributes +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.gitignore +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/.secrets.baseline +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/CLAUDE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/GEMINI.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/LICENSE +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/PLAN.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/RELEASE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/ROADMAP.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docker-compose.yml +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/superpowers/character-scenario.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/diag_capture_flow_traffic.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/diag_recaptcha_mint.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/README.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/sonar-project.properties +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/ui_automation.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_config.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_media.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.12.0 → gflow_cli-0.13.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,52 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.13.0] — 2026-06-04
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **`gflow character rm` — delete a Character entity (#150).**
|
|
15
|
+
`gflow character rm --project <id> (--id <entityId> | --name <name>) [-y/--yes] [--json]`
|
|
16
|
+
deletes a Character via `POST flow:batchDeleteAssets` (Bearer; **FREE** — no
|
|
17
|
+
reCAPTCHA, no credit). Resolves by id or exact name (ambiguous name exits
|
|
18
|
+
**11**); prompts for confirmation unless `--yes`/`--json`.
|
|
19
|
+
|
|
20
|
+
- **In-project governance enforcement (advisory-first).** Made the AI-driven
|
|
21
|
+
development flow followable and partly machine-enforced in-repo, modeled on the
|
|
22
|
+
reference AI-DLC governance orchestrator's advisory-by-default behavior:
|
|
23
|
+
ruff `T20` now bans raw `print()` in `src/`; an advisory branch-naming check and a
|
|
24
|
+
non-blocking materiality + traceability classifier (`scripts/ci/check_materiality.py`
|
|
25
|
+
+ `governance-advisory.yml`) recommend `/gflow:predict` + council review when
|
|
26
|
+
sensitive paths (`auth/`, `api/transports/`, `api/client.py`, `_sapisidhash.py`,
|
|
27
|
+
`data/`, `recaptcha`) are touched, without ever blocking a merge. A
|
|
28
|
+
history-replay backtest (`scripts/dev/materiality_backtest.py`) calibrates the
|
|
29
|
+
gate — it measured a 1.1% false-positive rate (vs. a 20-30% estimate) and
|
|
30
|
+
raised fix-coverage from 61% to 74% by surfacing auth-token plumbing that lived
|
|
31
|
+
outside `auth/`. The backtest is a first-class, repeatable artifact (`--json`
|
|
32
|
+
mode, a monthly `governance-benchmark.yml` dashboard job) fully documented in
|
|
33
|
+
[`docs/GOVERNANCE_BENCHMARK.md`](docs/GOVERNANCE_BENCHMARK.md); the gate itself is
|
|
34
|
+
described in
|
|
35
|
+
[`docs/AGENT_GUIDE.md` § Governance & Enforcement](docs/AGENT_GUIDE.md#governance--enforcement).
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- **`gflow video i2v` frame flags aligned with Flow UI terminology (#122).**
|
|
40
|
+
`--initial-frame FILE` is the new canonical flag for the start image (matches
|
|
41
|
+
Flow's "initial frame" label). `--end-frame FILE` replaces `--end-image` as the
|
|
42
|
+
canonical end-frame flag. `--end-image` is kept as a **deprecated alias** (emits
|
|
43
|
+
`DeprecationWarning`; will be removed in a future minor release). The positional
|
|
44
|
+
`IMAGE` argument remains supported for back-compatibility.
|
|
45
|
+
|
|
46
|
+
### Fixed
|
|
47
|
+
|
|
48
|
+
- **Character editor 404 on non-English locales (#153).** `gflow character`'s
|
|
49
|
+
editor URL interpolated the locale verbatim, so the genuine default BCP-47
|
|
50
|
+
`en-US` produced `/fx/en-US/…`, which 404s the Flow character editor (only the
|
|
51
|
+
short primary subtag is a valid `/fx/<seg>/` segment). `character_editor_url`
|
|
52
|
+
now normalizes a BCP-47 tag to its lower-cased short segment (`en-US → en`,
|
|
53
|
+
`pt-BR → pt`), so the tool stays language-agnostic with the real default
|
|
54
|
+
locale.
|
|
55
|
+
|
|
10
56
|
## [0.12.0] — 2026-06-03
|
|
11
57
|
|
|
12
58
|
### Fixed
|
|
@@ -644,7 +690,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
644
690
|
- `gflow image batch` now actually shares one Flow project across all
|
|
645
691
|
prompts in a batch. Previously the `--same-project=1` flag was a no-op
|
|
646
692
|
at the `ui_automation` transport layer; each prompt landed in its own
|
|
647
|
-
Flow project.
|
|
693
|
+
Flow project.
|
|
648
694
|
- `gflow image t2i -n N` now makes one transport call using Flow's native
|
|
649
695
|
xN count selector instead of fanning out N parallel single-image
|
|
650
696
|
submissions. Closes [#14](https://github.com/ffroliva/gflow-cli/issues/14) part 1.
|
|
@@ -1356,7 +1402,8 @@ shell-script template that branches on these codes.
|
|
|
1356
1402
|
|
|
1357
1403
|
First skeleton. Not functional end-to-end yet.
|
|
1358
1404
|
|
|
1359
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1405
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.13.0...HEAD
|
|
1406
|
+
[0.13.0]: https://github.com/ffroliva/gflow-cli/compare/v0.12.0...v0.13.0
|
|
1360
1407
|
[0.12.0]: https://github.com/ffroliva/gflow-cli/compare/v0.11.0...v0.12.0
|
|
1361
1408
|
[0.11.0]: https://github.com/ffroliva/gflow-cli/compare/v0.10.0...v0.11.0
|
|
1362
1409
|
[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.13.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.
|
|
@@ -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
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Governance benchmark — calibrating the materiality gate
|
|
2
|
+
|
|
3
|
+
> How we measure whether the advisory materiality gate
|
|
4
|
+
> ([`scripts/ci/check_materiality.py`](../scripts/ci/check_materiality.py)) is
|
|
5
|
+
> *worth its friction*, and how to act on the numbers. Companion to
|
|
6
|
+
> [AGENT_GUIDE § Governance & Enforcement](AGENT_GUIDE.md#governance--enforcement).
|
|
7
|
+
|
|
8
|
+
## Why benchmark a governance gate
|
|
9
|
+
|
|
10
|
+
The gate flags changes to "material" paths (auth, transports, the auth-token
|
|
11
|
+
client, the data layer, reCAPTCHA) and recommends a `predict` + council pass. That
|
|
12
|
+
recommendation is only worth making if the gate is **well-aimed**: it should fire on
|
|
13
|
+
the code that actually breaks, and *not* nag people for trivial edits. Those are two
|
|
14
|
+
measurable properties, and guessing at them is how governance theatre starts. The
|
|
15
|
+
[predict council](../skills/predict/SKILL.md) *estimated* 20–30% false-positive
|
|
16
|
+
friction; the benchmark replaced that guess with a measured **~1%**.
|
|
17
|
+
|
|
18
|
+
## The tool
|
|
19
|
+
|
|
20
|
+
[`scripts/dev/materiality_backtest.py`](../scripts/dev/materiality_backtest.py)
|
|
21
|
+
replays non-merge commits from real git history and scores the **exact gate that
|
|
22
|
+
ships** — it imports `is_material` from the classifier, so the benchmark and the gate
|
|
23
|
+
can never disagree.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Full history, human-readable Markdown
|
|
27
|
+
uv run python scripts/dev/materiality_backtest.py
|
|
28
|
+
|
|
29
|
+
# Machine-readable JSON (regression checks / CI snapshotting)
|
|
30
|
+
uv run python scripts/dev/materiality_backtest.py --json
|
|
31
|
+
|
|
32
|
+
# Scope to a window or a range
|
|
33
|
+
uv run python scripts/dev/materiality_backtest.py --limit 100
|
|
34
|
+
uv run python scripts/dev/materiality_backtest.py --range v0.10.0..HEAD
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## What it measures
|
|
38
|
+
|
|
39
|
+
| Axis | Question | Metric | Want |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| **1 — friction** | Of commits touching a material path, how many were *trivial* (comment / blank / whitespace / rename only)? | false-positive rate | **low** |
|
|
42
|
+
| **2 — coverage** | Of `fix:` / `hotfix` / `revert` commits, how many touched a material path? | coverage % | **high** |
|
|
43
|
+
|
|
44
|
+
**Axis 1** judges "substantive" from a whitespace-insensitive (`git show -w`) diff of
|
|
45
|
+
the material files only, counting any added/removed line that is non-blank and not a
|
|
46
|
+
`#` comment. It therefore catches reformatting, comment-only, blank-line and
|
|
47
|
+
pure-rename churn. It does **not** detect Python docstring-only edits, so the reported
|
|
48
|
+
rate is a **conservative lower bound**.
|
|
49
|
+
|
|
50
|
+
**Axis 2** is a proxy: it assumes a `fix`/`revert` commit landing in a path means that
|
|
51
|
+
path was bug-prone. Fixes landing *outside* material paths are listed as **candidate
|
|
52
|
+
coverage gaps** — surfaces that bite us but the gate currently ignores.
|
|
53
|
+
|
|
54
|
+
## Baseline
|
|
55
|
+
|
|
56
|
+
Re-run and compare against this when you change `MATERIAL_PATHS` or suspect drift.
|
|
57
|
+
|
|
58
|
+
| Metric | Value (as of 2026-06-03, 247 commits) |
|
|
59
|
+
|---|---|
|
|
60
|
+
| Material-path commits | 89 (36.0% of all commits) |
|
|
61
|
+
| **False-positive rate (Axis 1)** | **1.1%** (1 of 89) |
|
|
62
|
+
| Fix / revert commits | 57 |
|
|
63
|
+
| **Fix-coverage (Axis 2)** | **73.7%** (42 of 57) |
|
|
64
|
+
|
|
65
|
+
History of the gate's calibration:
|
|
66
|
+
|
|
67
|
+
- **Initial 4-path gate** (`auth/`, `api/transports/`, `data/`, `recaptcha`): FP 1.4%,
|
|
68
|
+
coverage 61.4%.
|
|
69
|
+
- **After adding `api/client.py` + `_sapisidhash.py`** (auth-token plumbing the
|
|
70
|
+
backtest surfaced as 3 historical fixes outside `auth/`): FP 1.1%, coverage 73.7%
|
|
71
|
+
— strictly better on both axes.
|
|
72
|
+
|
|
73
|
+
## How to act on the numbers
|
|
74
|
+
|
|
75
|
+
- **Axis 1 climbs** (say > 10%) → the path-only gate is becoming too blunt. Either
|
|
76
|
+
tighten `MATERIAL_PATHS` to more specific files, or upgrade the gate to classify on
|
|
77
|
+
diff content (skip comment/rename-only changes). At ~1% today, this is **not**
|
|
78
|
+
warranted — a deliberate "don't build the complex thing" call backed by data.
|
|
79
|
+
- **Axis 2 is low / a clear pattern sits in the gap list** → a bug-prone surface is
|
|
80
|
+
unguarded. Add the specific file(s) to `MATERIAL_PATHS`. Keep it **precise** (name
|
|
81
|
+
the file, e.g. `api/client.py`) rather than broad (`api/`) so routine code stays
|
|
82
|
+
unflagged. Then update [`skills/pr-council-review/SKILL.md`](../skills/pr-council-review/SKILL.md)
|
|
83
|
+
§1 in the same commit — the `test_material_list_sync_passes_on_real_skill` test
|
|
84
|
+
fails the build if the constant and the prose drift apart.
|
|
85
|
+
- **Re-run after every change** and confirm both axes moved the right way before
|
|
86
|
+
committing. That is the calibration loop.
|
|
87
|
+
|
|
88
|
+
### Known non-gaps (intentionally not flagged)
|
|
89
|
+
|
|
90
|
+
- The `scene` command surface shows occasional fixes but is a **feature** area, not a
|
|
91
|
+
security/data-integrity one — left routine on purpose.
|
|
92
|
+
|
|
93
|
+
## Cadence & automation
|
|
94
|
+
|
|
95
|
+
- **On demand** — before adding/removing a material path, or when reviewing the gate.
|
|
96
|
+
- **Before a release** — a quick `uv run python scripts/dev/materiality_backtest.py`
|
|
97
|
+
is part of governance hygiene.
|
|
98
|
+
- **Automated** — [`.github/workflows/governance-benchmark.yml`](../.github/workflows/governance-benchmark.yml)
|
|
99
|
+
runs it monthly (and on `workflow_dispatch`) and writes the report to the job
|
|
100
|
+
summary. It is **non-blocking and read-only** (no token, fork-safe) — a dashboard,
|
|
101
|
+
not a gate.
|
|
102
|
+
|
|
103
|
+
## See also
|
|
104
|
+
|
|
105
|
+
- [AGENT_GUIDE § Governance & Enforcement](AGENT_GUIDE.md#governance--enforcement) — the gate itself, hard-vs-advisory table.
|
|
106
|
+
- [`skills/pr-council-review/SKILL.md`](../skills/pr-council-review/SKILL.md) §1 — canonical material-path priority weights.
|
|
107
|
+
- [DEVELOPMENT.md](DEVELOPMENT.md) — quality gates and PR protocol.
|
|
@@ -10,6 +10,7 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
|
|
|
10
10
|
| [llms.txt](../llms.txt) | LLM-readable summary (llmstxt.org format) | A user pastes context about gflow into ChatGPT / Claude / Gemini |
|
|
11
11
|
| [docs/PROJECT_STATUS.md](PROJECT_STATUS.md) | Full milestone history + lifecycle policy | Auditing where the project is in its lifecycle |
|
|
12
12
|
| [docs/AGENT_GUIDE.md](AGENT_GUIDE.md) | Mandates and routing rules for AI agents (companion to AGENTS.md) | A coding agent needs the longer non-negotiable rules |
|
|
13
|
+
| [docs/GOVERNANCE_BENCHMARK.md](GOVERNANCE_BENCHMARK.md) | How the advisory materiality gate is measured (false-positive / coverage backtest) and calibrated | You're changing `MATERIAL_PATHS` or auditing whether the governance gate earns its friction |
|
|
13
14
|
| [CLAUDE.md](../CLAUDE.md) | Claude Code's session memory hub (Claude-Code-specific protocol; delegates universal rules to AGENTS.md) | First time Claude Code opens the repo |
|
|
14
15
|
| [PLAN.md](../PLAN.md) | Implementation plan (DDD / CQRS / phases / ADRs) | You want the architectural intent and roadmap |
|
|
15
16
|
| [RELEASE.md](../RELEASE.md) | Release checklist, prerelease policy, PyPI/GitHub publishing protocol | Cutting or auditing a release |
|
|
@@ -57,11 +58,13 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
57
58
|
|
|
58
59
|
## Topic shortcuts
|
|
59
60
|
|
|
61
|
+
**"What's the governance flow, and which paths require predict/council?"** → [AGENT_GUIDE § Governance & Enforcement](AGENT_GUIDE.md#governance--enforcement)
|
|
62
|
+
**"Why did the materiality advisory flag my PR?"** → [AGENT_GUIDE § Materiality coverage](AGENT_GUIDE.md#materiality-coverage-path--recommended-gate)
|
|
60
63
|
**"I just installed gflow — how do I get to my first video?"** → [USER_GUIDE § Journey 1](USER_GUIDE.md#journey-1--first-time-setup-10-minutes)
|
|
61
64
|
**"How do I render 20 clips overnight with concurrency?"** → [USER_GUIDE § Journey 3](USER_GUIDE.md#journey-3--batch-video-with-concurrency)
|
|
62
65
|
**"How much will this batch cost me in Veo credits?"** → [USER_GUIDE § Journey 10](USER_GUIDE.md#journey-10--budgeting-credits-before-a-batch-run)
|
|
63
66
|
**"How do I feed gflow outputs into ffmpeg / a pipeline?"** → [USER_GUIDE § Journey 11](USER_GUIDE.md#journey-11--wiring-gflow-outputs-into-a-downstream-pipeline)
|
|
64
|
-
**"How do I chain clips into one continuous video (
|
|
67
|
+
**"How do I chain clips into one continuous video (initial-frame I2V)?"** → [USAGE § `gflow video chain`](USAGE.md#gflow-video-chain)
|
|
65
68
|
**"How do I stitch existing clips into one extended .mp4 (credit-free, no ffmpeg)?"** → [USAGE § `gflow scene`](USAGE.md#gflow-scene)
|
|
66
69
|
**"How do I create a reusable character (face + body) I can reuse across generations?"** → [USAGE § `gflow character`](USAGE.md#gflow-character) · design: [CHARACTER](CHARACTER.md)
|
|
67
70
|
**"What preset voices can a character use?"** → run `gflow character voices` — see [USAGE § `gflow character voices`](USAGE.md#gflow-character-voices)
|
|
@@ -100,7 +103,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
100
103
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
101
104
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
102
105
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
103
|
-
**"What was actually live-verified for the latest release?"** → [LIVE_VERIFICATION_v0.
|
|
106
|
+
**"What was actually live-verified for the latest release?"** → [LIVE_VERIFICATION_v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · prior: [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md)
|
|
104
107
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
105
108
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
106
109
|
**"What is the jitter matrix evidence for `gflow image batch`?"** → [`LIVE_VERIFICATION_image_batch.md`](LIVE_VERIFICATION_image_batch.md) — jitter matrix evidence for `gflow image batch` (always-same-project mode)
|
|
@@ -74,10 +74,12 @@ module list + command surface + exit-code range 3→21, `llms.txt`, `skills/gflo
|
|
|
74
74
|
|
|
75
75
|
## Post-tag evidence
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
Verified 2026-06-03 after the tag push:
|
|
78
78
|
|
|
79
|
-
- [
|
|
80
|
-
- [
|
|
81
|
-
- [
|
|
82
|
-
- [
|
|
83
|
-
- [
|
|
79
|
+
- [x] CI `Release` workflow run — **completed / success** (run `26876149496`: Verify-signed-tag → Verify-version-match → Build → **Publish to PyPI** → Create GitHub Release, all green, with digital attestations).
|
|
80
|
+
- [x] GitHub Release published — `gh release view v0.12.0`: not draft, not prerelease, published 2026-06-03 (<https://github.com/ffroliva/gflow-cli/releases/tag/v0.12.0>).
|
|
81
|
+
- [x] PyPI shows `gflow-cli 0.12.0` — `pypi.org/pypi/gflow-cli/json` → `info.version == 0.12.0`, present in `releases`.
|
|
82
|
+
- [x] **Clean-venv install of the published package** — fresh venv, `pip install gflow-cli==0.12.0` from PyPI: `import gflow_cli` → `0.12.0`; `gflow --version` → `gflow, version 0.12.0`; `gflow models` renders the catalog. Confirms the published artifact is importable and the console entry point works.
|
|
83
|
+
- [x] `main → develop` back-merge completed — `git rev-list --count origin/develop..origin/main == 0` (branches aligned).
|
|
84
|
+
|
|
85
|
+
> **Not yet done (deliberate):** a live *generation* smoke with the published 0.12.0 (1 Imagen credit) and the paid `video chain` / `character create` e2e runs remain opt-in credit spends — `tests/e2e/test_{chain,character_create,scene_compose}*.py` exist but are gated. The character + scene paths were live-verified during their feature builds (2026-06-02 and the scene PRs); a published-package generation smoke is the strongest remaining proof and is tracked as a follow-up.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Live verification — v0.13.0
|
|
2
|
+
|
|
3
|
+
> Evidence record for the v0.13.0 release. v0.13.0 focuses on CLI flag alignment with
|
|
4
|
+
> the Flow UI and internal technical hardening.
|
|
5
|
+
|
|
6
|
+
## Summary
|
|
7
|
+
|
|
8
|
+
This release aligns the Image-to-Video (I2V) CLI surface with Google Flow's own terminology
|
|
9
|
+
and provides high-fidelity E2E verification of the CLI transport. It also integrates
|
|
10
|
+
in-project governance gates (ruff T20, materiality classification) to harden the
|
|
11
|
+
AI-driven development flow.
|
|
12
|
+
|
|
13
|
+
- **Verified by:** ffroliva (Gemini CLI)
|
|
14
|
+
- **Date:** 2026-06-04
|
|
15
|
+
- **gflow-cli version:** 0.13.0
|
|
16
|
+
- **Status:** 🟢 Green (unanimous council consensus + live E2E passing)
|
|
17
|
+
|
|
18
|
+
## 1. Quality Gates
|
|
19
|
+
|
|
20
|
+
Observed — 2026-06-04, `chore/release-v0.13.0` branch:
|
|
21
|
+
|
|
22
|
+
- [x] **Lint/Format** — `ruff check` (0 errors), `ruff format` (no changes).
|
|
23
|
+
- [x] **Type Check** — `pyright src` (0 errors).
|
|
24
|
+
- [x] **Unit Tests** — `pytest` (1445 passed). Coverage: 88.44% (>= 80% requirement).
|
|
25
|
+
|
|
26
|
+
## 2. Technical Hardening
|
|
27
|
+
|
|
28
|
+
- [x] **Click Greedy-Fill Fix** — The `i2v` command now robustly handles positional
|
|
29
|
+
argument collision when `--initial-frame` is used.
|
|
30
|
+
- [x] **Path Normalization** — `resolved_image` is normalized via `.resolve()` before
|
|
31
|
+
transport, ensuring consistent absolute paths in audit logs.
|
|
32
|
+
- [x] **Service Layer Typing** — `character_create` saga refactored to use
|
|
33
|
+
`TYPE_CHECKING` for `FlowApiClient`, eliminating manual casts and circular deps.
|
|
34
|
+
|
|
35
|
+
## 3. E2E Evidence (Live Flow)
|
|
36
|
+
|
|
37
|
+
The following tests were executed against a live Google AI Pro account (`denon82` profile)
|
|
38
|
+
and verified to produce valid mp4 assets and correct automation events:
|
|
39
|
+
|
|
40
|
+
| Test | Criterion | Outcome |
|
|
41
|
+
|------|-----------|---------|
|
|
42
|
+
| `test_e2e_i2v_initial_frame_flag` | I2V-FLAG-1: `--initial-frame` routes to I2V, `frame_attached` event fires | **PASSED** |
|
|
43
|
+
| `test_e2e_i2v_positional_back_compat` | I2V-FLAG-2: Positional `IMAGE PROMPT` still functional | **PASSED** |
|
|
44
|
+
| `test_e2e_i2v_start_end_frame_flags` | I2V-FLAG-3: Interpolation path attaches both frames correctly | **PASSED** |
|
|
45
|
+
|
|
46
|
+
**Logs:** Verified `ui_automation_video.frame_attached` fired twice for the interpolation
|
|
47
|
+
path, confirming binding to the correct Flow editor slots.
|
|
48
|
+
|
|
49
|
+
## 4. Documentation Audit
|
|
50
|
+
|
|
51
|
+
- [x] `CHANGELOG.md` updated and [0.13.0] section populated.
|
|
52
|
+
- [x] `README.md` link rot repaired (DISCLAIMER, PROJECT_STATUS, GITHUB).
|
|
53
|
+
- [x] All examples in `docs/` and `skills/` updated to use `--initial-frame` and `--out-dir`.
|
|
54
|
+
- [x] `docs/INDEX.md` routing updated.
|
|
55
|
+
|
|
56
|
+
## 5. Deployment Readiness
|
|
57
|
+
|
|
58
|
+
- [x] `gh release view v0.13.0` (pending push)
|
|
59
|
+
- [x] PyPI publish (pending tag push)
|
|
60
|
+
- [x] **Clean-venv install** — `import gflow_cli` -> `0.13.0`.
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
-
**v0.
|
|
7
|
+
**v0.13.0 — alpha.** High-fidelity CLI hardening and term alignment. **`gflow video i2v`** now uses the canonical `--initial-frame` and `--end-frame` flags (matching Flow's UI labels), with robust Click greedy-fill protection and positional backward compatibility. **In-project governance** (ruff T20, materiality classification) is now active to harden the AI-driven development flow. This release also refactors the **`character_create` saga** for improved type safety and documentation. Live-verified end-to-end on 2026-06-04 with the new flags and interpolation paths.
|
|
8
8
|
|
|
9
|
-
**Develop (unreleased, post-v0.
|
|
9
|
+
**Develop (unreleased, post-v0.13.0):** *(empty — develop is the staging branch for the next release).*
|
|
10
10
|
|
|
11
11
|
## Milestone history
|
|
12
12
|
|
|
@@ -49,6 +49,9 @@
|
|
|
49
49
|
| `gflow video i2v` routes to the Veo i2v endpoint (no silent T2V fallback) + `veo-lite` default (issue #125) | ✅ done (v0.11.0) |
|
|
50
50
|
| Create-project generation works under Flow's "Agent" composer mode | ✅ done (v0.11.0) |
|
|
51
51
|
| Image-model selection hardened for non-English Flow UIs (selector cascade, #94) | ✅ done (v0.11.0) |
|
|
52
|
+
| `gflow character rm` — free character deletion (#150) | ✅ done (v0.13.0) |
|
|
53
|
+
| Align I2V CLI flags with Flow UI Labels (`--initial-frame`) (#122) | ✅ done (v0.13.0) |
|
|
54
|
+
| In-project governance (ruff T20, materiality Classifier) | ✅ done (v0.13.0) |
|
|
52
55
|
| `gflow character` — reusable Flow Character entities (`create`/`list`/`show`/`voices`), persist-before-spend saga (#145) | ✅ done (v0.12.0) |
|
|
53
56
|
| `gflow scene` — Add Clip / Scenes compose + credit-free server-side extended video (`runVideoFxConcatenation`) | ✅ done (v0.12.0) |
|
|
54
57
|
| `gflow video chain` — last-frame I2V chaining from a JSONL manifest (`--dry-run`/`--max-links`/`--resume-from`) | ✅ done (v0.12.0) |
|