gflow-cli 0.59.0__tar.gz → 0.61.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.59.0 → gflow_cli-0.61.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/ci.yml +57 -7
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/deps-watch.yml +3 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/external-pr-triage.yml +9 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/governance-advisory.yml +11 -3
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/governance-benchmark.yml +2 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/main-base-guard.yml +2 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/pages.yml +2 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/release.yml +8 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/scorecard.yml +1 -1
- gflow_cli-0.61.0/.github/workflows/selector-probe.yml +26 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/CHANGELOG.md +177 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/PKG-INFO +2 -2
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +28 -4
- gflow_cli-0.61.0/deploy/logrotate-pr-triage +21 -0
- {gflow_cli-0.59.0/website → gflow_cli-0.61.0}/docs/E2E_TESTING.md +159 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/GITHUB.md +87 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/INDEX.md +8 -2
- gflow_cli-0.61.0/docs/LIVE_VERIFICATION_v0.60.0.md +180 -0
- gflow_cli-0.61.0/docs/LIVE_VERIFICATION_v0.61.0.md +164 -0
- gflow_cli-0.61.0/docs/superpowers/plans/2026-08-21-selector-registry.md +743 -0
- gflow_cli-0.61.0/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +171 -0
- gflow_cli-0.61.0/docs/superpowers/specs/2026-08-21-selector-registry-design.md +307 -0
- gflow_cli-0.61.0/docs/superpowers/specs/2026-08-26-model-attribution-provenance.md +168 -0
- gflow_cli-0.61.0/docs/superpowers/specs/2026-08-26-model-cost-quota-catalog.md +139 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/pyproject.toml +3 -3
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/autopilot/Dockerfile.triage +4 -0
- gflow_cli-0.61.0/scripts/autopilot/entrypoint.sh +10 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/autopilot/package-lock.json +48 -36
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/autopilot/package.json +1 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/autopilot/pr_triage_autopilot.py +105 -10
- gflow_cli-0.61.0/scripts/autopilot/run_sandboxed_review.sh +172 -0
- gflow_cli-0.61.0/scripts/canary/register_task.ps1 +79 -0
- gflow_cli-0.61.0/scripts/canary/run_canary.py +419 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/check_repo_hygiene.py +20 -6
- gflow_cli-0.61.0/scripts/dev/live_verify_policy_400_v060.py +142 -0
- gflow_cli-0.61.0/scripts/dev/live_verify_video_model_select.py +108 -0
- gflow_cli-0.61.0/scripts/dev/spike_model_inventory.py +158 -0
- gflow_cli-0.61.0/scripts/dev/spike_trpc_origin_referer_401.py +151 -0
- gflow_cli-0.61.0/scripts/dev/spike_video_tab_dom.py +102 -0
- gflow_cli-0.61.0/scripts/dev/verify_language_agnostic.py +113 -0
- gflow_cli-0.61.0/scripts/dev/verify_locale_navigation_race.py +111 -0
- gflow_cli-0.61.0/scripts/dev/verify_model_attribution.py +82 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/diag/README.md +1 -0
- gflow_cli-0.61.0/scripts/diag/diag_aisandbox_bearer.py +124 -0
- gflow_cli-0.61.0/scripts/probe/run_probe.py +210 -0
- gflow_cli-0.61.0/scripts/probe/spike_auth_matrix.py +131 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/client.py +91 -63
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/routes.py +68 -5
- gflow_cli-0.61.0/src/gflow_cli/api/transports/_common.py +327 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/base.py +31 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/drivers/classic.py +5 -1
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +8 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +4 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/ui_automation.py +262 -67
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/ui_automation_video.py +100 -61
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_character.py +9 -3
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/diagnostics.py +72 -13
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/errors.py +57 -1
- gflow_cli-0.61.0/src/gflow_cli/flow_selectors/__init__.py +1 -0
- gflow_cli-0.61.0/src/gflow_cli/flow_selectors/grading.py +51 -0
- gflow_cli-0.61.0/src/gflow_cli/flow_selectors/model.py +59 -0
- gflow_cli-0.61.0/src/gflow_cli/flow_selectors/registry.py +63 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/services/catalog_sync.py +80 -7
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/services/character_create.py +5 -2
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_generate_character.py +28 -5
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_post_json_aisandbox_auth.py +74 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_routes_character.py +16 -4
- gflow_cli-0.61.0/tests/api/test_routes_locale.py +68 -0
- gflow_cli-0.61.0/tests/api/transports/test_locale_navigation.py +148 -0
- gflow_cli-0.61.0/tests/api/transports/test_model_selection_loud.py +192 -0
- gflow_cli-0.61.0/tests/api/transports/test_navigation_settled.py +94 -0
- gflow_cli-0.61.0/tests/api/transports/test_policy_400.py +185 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_ui_automation.py +85 -60
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_ui_automation_batch.py +8 -8
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_ui_automation_video.py +64 -19
- gflow_cli-0.61.0/tests/api/transports/test_video_model_selection_loud.py +179 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/autopilot/test_pr_triage_autopilot.py +344 -2
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/conftest.py +26 -2
- gflow_cli-0.61.0/tests/fixtures/flow_model_inventory.json +23 -0
- gflow_cli-0.61.0/tests/fixtures/flow_project_listing_media.json +54 -0
- gflow_cli-0.61.0/tests/flow_selectors/test_grading.py +67 -0
- gflow_cli-0.61.0/tests/flow_selectors/test_model.py +37 -0
- gflow_cli-0.61.0/tests/flow_selectors/test_model_governance.py +250 -0
- gflow_cli-0.61.0/tests/flow_selectors/test_registry.py +47 -0
- gflow_cli-0.61.0/tests/flow_selectors/test_report.py +57 -0
- gflow_cli-0.61.0/tests/scripts/test_canary_classify.py +326 -0
- gflow_cli-0.61.0/tests/scripts/test_canary_reexec.py +133 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_check_repo_hygiene.py +46 -2
- gflow_cli-0.61.0/tests/scripts/test_workflow_hardening.py +203 -0
- gflow_cli-0.61.0/tests/services/test_media_attribution.py +91 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_errors_classification.py +9 -8
- gflow_cli-0.61.0/tests/test_incident_generation_requests.py +94 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_self_documenting_errors.py +34 -5
- gflow_cli-0.61.0/tests/tools/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/uv.lock +53 -53
- {gflow_cli-0.59.0 → gflow_cli-0.61.0/website}/docs/E2E_TESTING.md +159 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/requirements.txt +3 -3
- gflow_cli-0.59.0/scripts/autopilot/entrypoint.sh +0 -9
- gflow_cli-0.59.0/scripts/autopilot/run_sandboxed_review.sh +0 -115
- gflow_cli-0.59.0/src/gflow_cli/api/transports/_common.py +0 -137
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.env.template +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.gitattributes +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.gitignore +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/.secrets.baseline +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/AGENTS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/CLAUDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/LICENSE +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/RELEASE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/ROADMAP.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docker-compose.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.58.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.59.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/MCP.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/PROJECT_STATUS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/USAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/index.html +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/llms.txt +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_project_listing.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/README.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/sonar-project.properties +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/mcp/tools.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/services/doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_data_sync.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_data_sync_names_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_refresh_on_miss_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/fixtures/doctor_env.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/fixtures/listing_payload.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.59.0/tests/image_batch → gflow_cli-0.61.0/tests/flow_selectors}/__init__.py +0 -0
- {gflow_cli-0.59.0/tests/integration → gflow_cli-0.61.0/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.59.0/tests/services → gflow_cli-0.61.0/tests/integration}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_cli_parity.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.59.0/tests/smoke → gflow_cli-0.61.0/tests/services}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_catalog_sync.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_doctor.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.59.0/tests/tools → gflow_cli-0.61.0/tests/smoke}/__init__.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_config.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_media.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/MCP.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/MEDIA_LIBRARY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/USAGE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/index.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/mkdocs.yml +0 -0
- {gflow_cli-0.59.0 → gflow_cli-0.61.0}/website/requirements.in +0 -0
|
@@ -26,6 +26,7 @@ jobs:
|
|
|
26
26
|
steps:
|
|
27
27
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
28
28
|
with:
|
|
29
|
+
persist-credentials: false
|
|
29
30
|
fetch-depth: 0 # full history so gitleaks can diff against base
|
|
30
31
|
|
|
31
32
|
- name: Run gitleaks
|
|
@@ -39,8 +40,10 @@ jobs:
|
|
|
39
40
|
runs-on: ubuntu-latest
|
|
40
41
|
steps:
|
|
41
42
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
43
|
+
with:
|
|
44
|
+
persist-credentials: false
|
|
42
45
|
- name: Install uv
|
|
43
|
-
uses: astral-sh/setup-uv@
|
|
46
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
44
47
|
- name: Audit locked dependencies for known CVEs
|
|
45
48
|
# Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
|
|
46
49
|
#
|
|
@@ -57,6 +60,42 @@ jobs:
|
|
|
57
60
|
# dependabot ecosystem — bump by hand when it drifts).
|
|
58
61
|
uvx pip-audit==2.10.1 -r requirements-audit.txt
|
|
59
62
|
|
|
63
|
+
# ── Security gate: static analysis of the workflows themselves ───────────
|
|
64
|
+
# Everything else in this file audits the Python we ship. Nothing audited the
|
|
65
|
+
# CI that ships it, and CI is a supply-chain surface in its own right: it
|
|
66
|
+
# holds a repository token, it publishes to PyPI, and its inputs (branch
|
|
67
|
+
# names, PR titles, fork content) are attacker-controllable text.
|
|
68
|
+
#
|
|
69
|
+
# zizmor is what turns that into a gate. It found real defects on its first
|
|
70
|
+
# run over this repo (#565): 12 checkouts persisting the job token into the
|
|
71
|
+
# workspace, and `${{ github.base_ref }}` interpolated straight into a
|
|
72
|
+
# governance-advisory shell script. Both are fixed; this job is what stops
|
|
73
|
+
# them coming back one copy-pasted step at a time.
|
|
74
|
+
workflow-audit:
|
|
75
|
+
name: Workflow audit (zizmor)
|
|
76
|
+
runs-on: ubuntu-latest
|
|
77
|
+
steps:
|
|
78
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
79
|
+
with:
|
|
80
|
+
persist-credentials: false
|
|
81
|
+
|
|
82
|
+
- name: Install uv
|
|
83
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
84
|
+
|
|
85
|
+
- name: Audit workflows (zizmor)
|
|
86
|
+
# --offline: the online audits need a GH token and reach the network, so
|
|
87
|
+
# they would make this gate non-deterministic and unrunnable on fork
|
|
88
|
+
# PRs. Action freshness/pinning is already covered by Dependabot plus
|
|
89
|
+
# Scorecard's Pinned-Dependencies check.
|
|
90
|
+
# --min-severity low: informational findings are advisory, not defects.
|
|
91
|
+
# The one open today is `superfluous-actions` on
|
|
92
|
+
# softprops/action-gh-release; rewriting the release publisher is not
|
|
93
|
+
# a hardening change and is deliberately declined (docs/GITHUB.md).
|
|
94
|
+
# Version pinned for a reproducible gate — uvx has no Dependabot
|
|
95
|
+
# ecosystem, so bump it by hand (the pin is asserted by
|
|
96
|
+
# tests/scripts/test_workflow_hardening.py, which fails if the two drift).
|
|
97
|
+
run: uvx zizmor==1.29.0 --offline --min-severity low .github/workflows/
|
|
98
|
+
|
|
60
99
|
# ── Supply-chain gate: resolve WITHOUT the lockfile ───────────────────────
|
|
61
100
|
# Every other job installs via `uv sync`, which honours uv.lock. That means CI
|
|
62
101
|
# never exercises the version RANGES in pyproject.toml — the exact blind spot
|
|
@@ -73,9 +112,11 @@ jobs:
|
|
|
73
112
|
runs-on: ubuntu-latest
|
|
74
113
|
steps:
|
|
75
114
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
115
|
+
with:
|
|
116
|
+
persist-credentials: false
|
|
76
117
|
|
|
77
118
|
- name: Install uv
|
|
78
|
-
uses: astral-sh/setup-uv@
|
|
119
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
79
120
|
|
|
80
121
|
- name: Set up Python
|
|
81
122
|
run: uv python install 3.13
|
|
@@ -127,18 +168,24 @@ jobs:
|
|
|
127
168
|
python-version: ["3.11", "3.12", "3.13"]
|
|
128
169
|
steps:
|
|
129
170
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
171
|
+
with:
|
|
172
|
+
persist-credentials: false
|
|
130
173
|
|
|
131
174
|
- name: Install uv
|
|
132
|
-
uses: astral-sh/setup-uv@
|
|
175
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
133
176
|
|
|
134
177
|
- name: Set up Python
|
|
135
178
|
run: uv python install ${{ matrix.python-version }}
|
|
136
179
|
|
|
180
|
+
# --frozen: install from the committed uv.lock without re-resolving it.
|
|
181
|
+
# Plain `uv sync` REWRITES uv.lock in place, which would silently repair
|
|
182
|
+
# the exact version drift the hygiene gate below exists to catch.
|
|
137
183
|
- name: Install deps
|
|
138
|
-
run: uv sync --extra dev
|
|
184
|
+
run: uv sync --frozen --extra dev
|
|
139
185
|
|
|
140
|
-
-
|
|
141
|
-
|
|
186
|
+
# --no-sync for the same reason: `uv run` re-locks before running.
|
|
187
|
+
- name: Repo hygiene (no artefacts, no hardcoded paths, version lockstep)
|
|
188
|
+
run: uv run --no-sync python scripts/ci/check_repo_hygiene.py
|
|
142
189
|
|
|
143
190
|
- name: Documentation links
|
|
144
191
|
run: uv run python scripts/ci/check_doc_links.py
|
|
@@ -196,9 +243,11 @@ jobs:
|
|
|
196
243
|
os: [windows-latest, macos-latest, ubuntu-latest]
|
|
197
244
|
steps:
|
|
198
245
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
246
|
+
with:
|
|
247
|
+
persist-credentials: false
|
|
199
248
|
|
|
200
249
|
- name: Install uv
|
|
201
|
-
uses: astral-sh/setup-uv@
|
|
250
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
202
251
|
|
|
203
252
|
- name: Set up Python
|
|
204
253
|
run: uv python install 3.13
|
|
@@ -237,6 +286,7 @@ jobs:
|
|
|
237
286
|
steps:
|
|
238
287
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
239
288
|
with:
|
|
289
|
+
persist-credentials: false
|
|
240
290
|
fetch-depth: 0 # shallow clones break blame / new-code detection
|
|
241
291
|
|
|
242
292
|
- name: Download coverage report
|
|
@@ -29,9 +29,11 @@ jobs:
|
|
|
29
29
|
runs-on: ubuntu-latest
|
|
30
30
|
steps:
|
|
31
31
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
32
|
+
with:
|
|
33
|
+
persist-credentials: false
|
|
32
34
|
|
|
33
35
|
- name: Install uv
|
|
34
|
-
uses: astral-sh/setup-uv@
|
|
36
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
35
37
|
|
|
36
38
|
- name: Set up Python
|
|
37
39
|
run: uv python install 3.13
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
name: External PR Triage
|
|
2
2
|
|
|
3
|
+
# `pull_request_target` is deliberate and is the reason this file is the
|
|
4
|
+
# highest-risk surface in the repo: labelling a fork's PR needs a token forks
|
|
5
|
+
# cannot be given, and `pull_request` does not have one. The trigger is only
|
|
6
|
+
# unsafe when the workflow CHECKS OUT or EXECUTES the untrusted head — this one
|
|
7
|
+
# never does: there is no `actions/checkout` step at all, every PR field is read
|
|
8
|
+
# from `context.payload` inside github-script, and permissions are scoped to
|
|
9
|
+
# `issues`/`pull-requests` write. Keep all three properties or drop the
|
|
10
|
+
# suppression with them.
|
|
3
11
|
on:
|
|
4
|
-
pull_request_target:
|
|
12
|
+
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
|
5
13
|
types: [opened, reopened, synchronize, ready_for_review, edited]
|
|
6
14
|
|
|
7
15
|
permissions:
|
|
@@ -21,13 +21,21 @@ jobs:
|
|
|
21
21
|
steps:
|
|
22
22
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
23
23
|
with:
|
|
24
|
+
persist-credentials: false
|
|
24
25
|
fetch-depth: 0 # full history so `git diff origin/<base>..HEAD` resolves
|
|
25
26
|
|
|
26
27
|
- name: Install uv
|
|
27
|
-
uses: astral-sh/setup-uv@
|
|
28
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
28
29
|
|
|
29
30
|
- name: Classify touched paths (advisory, never blocks)
|
|
31
|
+
# BASE_REF arrives through `env:`, never interpolated into the script
|
|
32
|
+
# body: a branch name is attacker-supplied text, and `${{ ... }}` is
|
|
33
|
+
# substituted before the shell ever sees it (zizmor: template-injection).
|
|
34
|
+
# The fetch is belt-and-braces — `fetch-depth: 0` above already brings
|
|
35
|
+
# the base branch down — and needs no credential on a public repo.
|
|
36
|
+
env:
|
|
37
|
+
BASE_REF: ${{ github.base_ref }}
|
|
30
38
|
run: |
|
|
31
|
-
git fetch --no-tags origin "$
|
|
39
|
+
git fetch --no-tags origin "$BASE_REF" || true
|
|
32
40
|
uv run python scripts/ci/check_materiality.py \
|
|
33
|
-
--base "origin/$
|
|
41
|
+
--base "origin/$BASE_REF"
|
|
@@ -20,10 +20,11 @@ jobs:
|
|
|
20
20
|
steps:
|
|
21
21
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
22
22
|
with:
|
|
23
|
+
persist-credentials: false
|
|
23
24
|
fetch-depth: 0 # full history — the backtest replays every commit
|
|
24
25
|
|
|
25
26
|
- name: Install uv
|
|
26
|
-
uses: astral-sh/setup-uv@
|
|
27
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
27
28
|
|
|
28
29
|
- name: Run backtest (advisory; writes to job summary)
|
|
29
30
|
run: uv run python scripts/dev/materiality_backtest.py >> "$GITHUB_STEP_SUMMARY"
|
|
@@ -27,6 +27,8 @@ jobs:
|
|
|
27
27
|
runs-on: ubuntu-latest
|
|
28
28
|
steps:
|
|
29
29
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
30
|
+
with:
|
|
31
|
+
persist-credentials: false
|
|
30
32
|
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
|
|
31
33
|
with:
|
|
32
34
|
python-version: "3.12"
|
|
@@ -25,10 +25,17 @@ jobs:
|
|
|
25
25
|
steps:
|
|
26
26
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
27
27
|
with:
|
|
28
|
+
persist-credentials: false
|
|
28
29
|
fetch-depth: 0
|
|
29
30
|
|
|
30
31
|
- name: Install uv
|
|
31
|
-
uses: astral-sh/setup-uv@
|
|
32
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
33
|
+
with:
|
|
34
|
+
# This is the one workflow that publishes artefacts (PyPI + GitHub
|
|
35
|
+
# Release), so it must not restore a cache any other workflow can
|
|
36
|
+
# write: a poisoned entry would reach a signed release. Releases are
|
|
37
|
+
# rare; the cold resolve costs seconds (zizmor: cache-poisoning).
|
|
38
|
+
enable-cache: false
|
|
32
39
|
|
|
33
40
|
- name: Set up Python
|
|
34
41
|
run: uv python install 3.12
|
|
@@ -47,6 +47,6 @@ jobs:
|
|
|
47
47
|
retention-days: 5
|
|
48
48
|
|
|
49
49
|
- name: Upload to code-scanning
|
|
50
|
-
uses: github/codeql-action/upload-sarif@
|
|
50
|
+
uses: github/codeql-action/upload-sarif@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4
|
|
51
51
|
with:
|
|
52
52
|
sarif_file: results.sarif
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: Selector drift probe
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 5 * * *"
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
probe:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 15
|
|
15
|
+
if: github.repository == 'ffroliva/gflow-cli'
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
|
|
18
|
+
with: { persist-credentials: false }
|
|
19
|
+
- uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
20
|
+
- run: uv sync --frozen
|
|
21
|
+
- run: uv run playwright install chromium --with-deps
|
|
22
|
+
- name: Probe
|
|
23
|
+
env:
|
|
24
|
+
GFLOW_CI_SESSION_TOKEN: ${{ secrets.GFLOW_CI_SESSION_TOKEN }}
|
|
25
|
+
GFLOW_CI_PROJECT_ID: ${{ secrets.GFLOW_CI_PROJECT_ID }}
|
|
26
|
+
run: uv run python scripts/probe/run_probe.py --surface editor
|
|
@@ -7,6 +7,180 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.61.0] — 2026-08-27
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **A requested image model that cannot be selected no longer generates silently
|
|
15
|
+
on a different one ([#586](https://github.com/ffroliva/gflow-cli/issues/586)).**
|
|
16
|
+
`_select_image_model` swallowed every failure, logged a warning, and let the
|
|
17
|
+
generation proceed on whatever the project's picker already held. Observed
|
|
18
|
+
live: `--model imagen4` produced an image on `NARWHAL` and exited **0** —
|
|
19
|
+
confirmed three ways (log, catalog, and `imageModelName` in a HAR). Flow has
|
|
20
|
+
removed `Imagen 4` from its picker, and `has-text('Nano Banana 2')` had become
|
|
21
|
+
ambiguous with the newly-offered `Nano Banana 2 Lite`, so `.first` resolved by
|
|
22
|
+
DOM order. A missing or ambiguous selector now raises `UiSelectorDriftError`
|
|
23
|
+
(exit 23) naming what Flow actually offered, before anything is submitted.
|
|
24
|
+
|
|
25
|
+
- **A requested video model that cannot be selected no longer generates on a
|
|
26
|
+
different one — and charges for it
|
|
27
|
+
([#539](https://github.com/ffroliva/gflow-cli/issues/539)).** `_select_video_model`
|
|
28
|
+
refused only on i2v-with-frames; a plain `t2v`/`r2v` miss logged "Flow default
|
|
29
|
+
model applies" and returned, so the run generated on whatever the picker already
|
|
30
|
+
held and spent that tier's credits — veo-quality costs 100 against veo-lite's 10.
|
|
31
|
+
Read live, Flow's picker offers exactly `Omni Flash` / `Veo 3.1 - Lite` / `Fast` /
|
|
32
|
+
`Quality`, so `--model veo-lite-lp` matched nothing and was a reachable,
|
|
33
|
+
credit-spending wrong-model path. Every miss is now fatal (exit 18) naming what
|
|
34
|
+
Flow offered, and an **ambiguous** selector is refused rather than resolved with
|
|
35
|
+
`.first`, which picks by DOM order across tiers that differ 10x in cost. Unlike
|
|
36
|
+
the image arm, refusing is unambiguous here: `--model` defaults to `None` on
|
|
37
|
+
every video command, so reaching the picker means a model was explicitly asked
|
|
38
|
+
for. Verified with a zero-credit A/B against live Flow — the pre-fix code
|
|
39
|
+
returned success for a model Flow does not offer; the new code refuses.
|
|
40
|
+
|
|
41
|
+
- **Four more navigations settle before acting on the page
|
|
42
|
+
([#584](https://github.com/ffroliva/gflow-cli/issues/584)).** #580 settled the
|
|
43
|
+
three sites it touched; an audit of every `page.goto` found four more with the
|
|
44
|
+
same defect. The worst is `evaluate_fetch.refresh_auth`, which re-navigates to
|
|
45
|
+
refresh page-context tokens and reported success while the page was still
|
|
46
|
+
moving. Two more (`evaluate_fetch` setup, `sapisidhash` fingerprint capture)
|
|
47
|
+
run `page.evaluate` immediately after navigating, where a mid-flight redirect
|
|
48
|
+
raises "Execution context was destroyed" rather than failing quietly. The
|
|
49
|
+
fourth (`_enter_editor`'s gallery return) ran `_bypass_onboarding` — real
|
|
50
|
+
button clicks — on a page about to navigate away. A new AST-based test pins
|
|
51
|
+
every `goto` to a following settle, so the audit does not have to be redone
|
|
52
|
+
by hand.
|
|
53
|
+
|
|
54
|
+
- **The nightly canary now runs the version of itself that it just pulled
|
|
55
|
+
([#582](https://github.com/ffroliva/gflow-cli/issues/582)).** `run_canary.py
|
|
56
|
+
--pull` fast-forwards the checkout and then keeps executing the copy Python
|
|
57
|
+
loaded at startup, so every runner change was silently one night late. This was
|
|
58
|
+
not theoretical: #572 added `-o junit_logging=all` so a preserved RED would
|
|
59
|
+
carry the structlog line that decides #561, and the next run pulled it and
|
|
60
|
+
still produced a RED with zero log output — three REDs untriageable, and the
|
|
61
|
+
failure reads as "the fix did not work". The runner now re-runs itself once
|
|
62
|
+
when a successful pull changed its own source, guarded by both an env var and
|
|
63
|
+
a content digest (either alone prevents a loop), via `subprocess.run` rather
|
|
64
|
+
than `os.execv` so Task Scheduler still sees one process and the real exit code.
|
|
65
|
+
|
|
66
|
+
- **Editor navigation no longer races a locale redirect on non-`en` accounts
|
|
67
|
+
([#580](https://github.com/ffroliva/gflow-cli/issues/580)).** `_enter_editor`
|
|
68
|
+
built its URL from a hardcoded `locale="en-US"` that no caller ever overrode,
|
|
69
|
+
so every account was sent to `/fx/en/...`. On a pt-BR account Flow redirects
|
|
70
|
+
that to `/fx/pt/...` **after `page.goto` has already returned** — leaving
|
|
71
|
+
overlay dismissal and prompt submission running against a page about to be
|
|
72
|
+
navigated away. That is how [#395](https://github.com/ffroliva/gflow-cli/issues/395)'s
|
|
73
|
+
"character-route bounce" presented. The client now learns the account's real
|
|
74
|
+
locale from where Flow itself lands (the only trustworthy source: `auth/session`
|
|
75
|
+
carries no locale, and `navigator.language` reports the value gflow sets when
|
|
76
|
+
launching the context), hands it to the transport through the typed
|
|
77
|
+
`TransportSetup` seam, and an independent settle-wait tolerates any redirect we
|
|
78
|
+
did not predict. An unresolved locale omits the segment rather than guessing.
|
|
79
|
+
`gflow character create --locale` now defaults to the account's locale instead
|
|
80
|
+
of `en-US`; the previous hardcoded default meant the character editor — the
|
|
81
|
+
surface #395 was reported against — was still routed to `/fx/en/...` on every
|
|
82
|
+
account, and the character route never waited for a settle at all.
|
|
83
|
+
|
|
84
|
+
Live-verified on a pt-BR account with a control arm: the fix navigates
|
|
85
|
+
race-free while the pre-fix path still redirects. Accounts Flow does not
|
|
86
|
+
redirect (e.g. `en`) skip the wait entirely after a single bounded probe, so
|
|
87
|
+
they pay no per-navigation cost.
|
|
88
|
+
|
|
89
|
+
### Added
|
|
90
|
+
|
|
91
|
+
- **Server-side model attribution
|
|
92
|
+
([#586](https://github.com/ffroliva/gflow-cli/issues/586)).**
|
|
93
|
+
`parse_media_attribution` reads `modelNameType` / `seed` / `aspectRatio` from
|
|
94
|
+
the `flow.projectInitialData` listing gflow already fetches — the same payload
|
|
95
|
+
the sync path walks for `name` and discards the rest of. This matters most on
|
|
96
|
+
the **agentic** arm, where those fields were previously synthesised from our
|
|
97
|
+
own request because they live in a Web-Worker SSE stream Playwright cannot
|
|
98
|
+
observe; "not visible to the page" was never the same as "unknowable". Verified
|
|
99
|
+
live: an agentic run that requested `GEM_PIX_2` was attributed `NARWHAL` by the
|
|
100
|
+
server, with a real seed where the catalog held `0`.
|
|
101
|
+
|
|
102
|
+
## [0.60.0] — 2026-08-25
|
|
103
|
+
|
|
104
|
+
### Added
|
|
105
|
+
|
|
106
|
+
- **Selector registry + nightly CI drift probe
|
|
107
|
+
([#404](https://github.com/ffroliva/gflow-cli/issues/404),
|
|
108
|
+
[#493](https://github.com/ffroliva/gflow-cli/issues/493),
|
|
109
|
+
[#313](https://github.com/ffroliva/gflow-cli/issues/313)).** New
|
|
110
|
+
`gflow_cli.flow_selectors` package: a structured, enumerable inventory of the
|
|
111
|
+
Flow DOM selectors gflow depends on (`Surface`, `Selector`) plus a pure
|
|
112
|
+
grader (`HIT` / `FALLBACK` / `AMBIGUOUS` / `MISS` / `EXPECTED_ABSENT`), so
|
|
113
|
+
selector drift is *named* rather than inferred from a failing test. A $0
|
|
114
|
+
probe (`scripts/probe/run_probe.py`, driven by the `selector-probe` workflow
|
|
115
|
+
on `schedule` + `workflow_dispatch` only) walks the registry against a live
|
|
116
|
+
editor: navigate and read only, never generates. Exit 0 clean / 1 drift /
|
|
117
|
+
2 inconclusive — an expired token or dead project is never published as
|
|
118
|
+
drift.
|
|
119
|
+
|
|
120
|
+
- **Incident bundles record what was submitted
|
|
121
|
+
([#528](https://github.com/ffroliva/gflow-cli/issues/528)).**
|
|
122
|
+
`network.json` gains a `generation_requests` array carrying a counts-only
|
|
123
|
+
summary of each outgoing generation submit (body size, reference-entity
|
|
124
|
+
count, reference-field count). The reference shape that triggers a policy 400
|
|
125
|
+
was previously visible only in the stderr stream, so bundles attached to an
|
|
126
|
+
issue could not be diagnosed. Counts and booleans only — no key names, field
|
|
127
|
+
values, or prompt text — matching the existing §5.3 retention boundary.
|
|
128
|
+
|
|
129
|
+
### Changed
|
|
130
|
+
|
|
131
|
+
- **All labs.google requests now carry `origin`/`referer`
|
|
132
|
+
([#578](https://github.com/ffroliva/gflow-cli/pull/578)).** Header
|
|
133
|
+
construction moved into a single `_request_headers()` shared by
|
|
134
|
+
`_post_json`/`_patch_json`/`_get_json`, which previously assembled headers
|
|
135
|
+
inline three times and could diverge per verb. The labs lane now sends the
|
|
136
|
+
same `origin`/`referer` every other lane already sent. A live A/B against
|
|
137
|
+
`project.createProject` showed these headers are **not** required — an
|
|
138
|
+
origin-less mutation still returns 200 — so this is consistency and
|
|
139
|
+
defence-in-depth, not a fix for any observed failure.
|
|
140
|
+
|
|
141
|
+
### Fixed
|
|
142
|
+
|
|
143
|
+
- **Content-policy 400s are no longer misclassified as `WireFormatError`
|
|
144
|
+
([#528](https://github.com/ffroliva/gflow-cli/issues/528)).** An HTTP 400 from
|
|
145
|
+
`flowMedia:batchGenerateImages` or `batchAsyncGenerateVideo*` now raises
|
|
146
|
+
`ContentPolicyError` with remediation that names the levers that actually
|
|
147
|
+
work — reduce to a single face-bearing reference, replace age-explicit person
|
|
148
|
+
descriptors with relational or role nouns — and states outright that
|
|
149
|
+
shortening the prompt does not help. Previously these surfaced as "the
|
|
150
|
+
request was rejected as malformed… retry with a simpler prompt text", which
|
|
151
|
+
sends operators down a path that cannot succeed. Same defect shape as
|
|
152
|
+
[#379](https://github.com/ffroliva/gflow-cli/issues/379) (429), one status
|
|
153
|
+
over, and the self-documenting-errors goal of
|
|
154
|
+
[#380](https://github.com/ffroliva/gflow-cli/issues/380).
|
|
155
|
+
- **Video generation gained the 429 branch the image path got in #379.** A
|
|
156
|
+
quota hit on `batchAsyncGenerateVideo*` raised `WireFormatError` instead of
|
|
157
|
+
`RateLimitError`, losing `Retry-After` and the retryable classification.
|
|
158
|
+
- **`generate_images_batch` no longer reports a bare, remediation-free
|
|
159
|
+
`GFlowError`** when every response failed — it classifies the first error the
|
|
160
|
+
same way the single-prompt path does.
|
|
161
|
+
|
|
162
|
+
### Security
|
|
163
|
+
|
|
164
|
+
- **CI/CD supply-chain hardening
|
|
165
|
+
([#565](https://github.com/ffroliva/gflow-cli/issues/565)).** Every
|
|
166
|
+
`actions/checkout` step now sets `persist-credentials: false` (12 existing
|
|
167
|
+
steps fixed across `ci.yml`, `deps-watch.yml`, `governance-advisory.yml`,
|
|
168
|
+
`governance-benchmark.yml`, `main-base-guard.yml`, `pages.yml` and
|
|
169
|
+
`release.yml`); the default leaves the job token in `.git/config` for the rest
|
|
170
|
+
of the job. No workflow needed it — releases publish over PyPI Trusted
|
|
171
|
+
Publishing (OIDC) and Pages deploys over `actions/deploy-pages`. A new
|
|
172
|
+
`workflow-audit` job runs [zizmor](https://github.com/zizmorcore/zizmor)
|
|
173
|
+
(pinned, `--offline`) over `.github/workflows/` on every push and PR, so the
|
|
174
|
+
class cannot come back. Its first run also caught two defects the manual pass
|
|
175
|
+
missed: `${{ github.base_ref }}` interpolated directly into a
|
|
176
|
+
`governance-advisory.yml` shell script (template injection — the value now
|
|
177
|
+
arrives through `env:`), and a shared uv cache restored by the publishing
|
|
178
|
+
release job (cache poisoning — caching is now off there). The
|
|
179
|
+
`pull_request_target` trigger in `external-pr-triage.yml` is suppressed inline
|
|
180
|
+
with its rationale, and a changelog-guard workflow was evaluated and declined
|
|
181
|
+
— both decisions recorded in
|
|
182
|
+
[docs/GITHUB.md § Workflow Security Gates](docs/GITHUB.md#workflow-security-gates).
|
|
183
|
+
|
|
10
184
|
## [0.59.0] — 2026-08-16
|
|
11
185
|
|
|
12
186
|
### Added
|
|
@@ -3073,7 +3247,9 @@ shell-script template that branches on these codes.
|
|
|
3073
3247
|
|
|
3074
3248
|
First skeleton. Not functional end-to-end yet.
|
|
3075
3249
|
|
|
3076
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
3250
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.61.0...HEAD
|
|
3251
|
+
[0.61.0]: https://github.com/ffroliva/gflow-cli/compare/v0.60.0...v0.61.0
|
|
3252
|
+
[0.60.0]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...v0.60.0
|
|
3077
3253
|
[0.59.0]: https://github.com/ffroliva/gflow-cli/compare/v0.58.0...v0.59.0
|
|
3078
3254
|
[0.58.0]: https://github.com/ffroliva/gflow-cli/compare/v0.57.1...v0.58.0
|
|
3079
3255
|
[0.57.1]: https://github.com/ffroliva/gflow-cli/compare/v0.57.0...v0.57.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.61.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
|
|
@@ -58,7 +58,7 @@ Requires-Dist: numpy>=1.24; extra == 'dev'
|
|
|
58
58
|
Requires-Dist: pyright>=1.1.0; extra == 'dev'
|
|
59
59
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
60
60
|
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
61
|
-
Requires-Dist: ruff==0.16.
|
|
61
|
+
Requires-Dist: ruff==0.16.4; extra == 'dev'
|
|
62
62
|
Provides-Extra: gcs
|
|
63
63
|
Requires-Dist: gcsfs>=2024.2.0; extra == 'gcs'
|
|
64
64
|
Requires-Dist: universal-pathlib>=0.2.5; extra == 'gcs'
|
|
@@ -16,6 +16,8 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
|
|
|
16
16
|
| `TELEGRAM_USER_ID` | Autopilot orchestrator (host) | The chat ID to receive triage alert messages. |
|
|
17
17
|
| `PR_TRIAGE_ENGINE` | Autopilot orchestrator (host), optional | Review engine selector. Default `council-claude`; any other value exits at startup (`council-multi-cli` is reserved backlog). |
|
|
18
18
|
| `HERMES_OPS_DIR` | Autopilot orchestrator (host), optional | Location of the hermes-ops checkout hosting the Resend email notifier. Default `/opt/hermes-ops`. |
|
|
19
|
+
| `GH_SANDBOX_TOKEN` | Review **container** | Fine-grained **read-only** PAT for the repo under review. The container only reads the PR; the host posts the comment. If unset the orchestrator falls back and raises an alert rather than degrading silently. Stored in the SOPS secret store. |
|
|
20
|
+
| `GFLOW_TRIAGE_MEMORY_DIR` | Autopilot orchestrator (host), optional | Council memory directory mounted read-only for D5. Set it only to override the XDG default (`$XDG_DATA_HOME/gflow-cli/memory`, i.e. `~/.local/share/gflow-cli/memory`). **Never put a machine-specific path in the cron line** — see §2. |
|
|
19
21
|
| `RESEND_API_KEY` | Email notifier (hermes-ops) | Resend API key consumed by `$HERMES_OPS_DIR/scripts/notify/email_notify.py`. |
|
|
20
22
|
| `HERMES_NOTIFY_EMAIL_TO` | Email notifier (hermes-ops) | Recipient address for high-signal triage emails. |
|
|
21
23
|
| `HERMES_NOTIFY_EMAIL_FROM` | Email notifier (hermes-ops) | Verified sender address for the Resend account. |
|
|
@@ -28,8 +30,19 @@ The autopilot orchestrator (`scripts/autopilot/pr_triage_autopilot.py`) runs as
|
|
|
28
30
|
|
|
29
31
|
Deploy the following layout on the VPS:
|
|
30
32
|
- `/opt/gflow-cli`: Dedicated git repository checkout representing the active branch.
|
|
31
|
-
-
|
|
32
|
-
|
|
33
|
+
- `~hermes/.local/share/gflow-cli/memory`: Council memory namespace, mounted read-only into the sandbox for dimension D5.
|
|
34
|
+
|
|
35
|
+
Create the memory directory once, as the user the cron runs under:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
sudo -u hermes mkdir -p ~hermes/.local/share/gflow-cli/memory
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
An **empty** directory is a valid deployment — D5 then reports that no memory is available, and the other 13 dimensions run normally. Populate it only if you want the council to consult durable project memory.
|
|
42
|
+
|
|
43
|
+
> **The memory path is resolved by the orchestrator, never hardcoded.** Precedence is `--memory-dir` > `$GFLOW_TRIAGE_MEMORY_DIR` > `$XDG_DATA_HOME/gflow-cli/memory` (XDG default, falling back to `~/.local/share`). `XDG_DATA_HOME` is the correct slot per the XDG Base Directory Specification: council memory is durable knowledge that should be backed up, not regenerable cache or throwaway state.
|
|
44
|
+
>
|
|
45
|
+
> The orchestrator validates the resolved path on the host and refuses to start with an actionable error if it is missing, rather than failing later inside the container.
|
|
33
46
|
|
|
34
47
|
---
|
|
35
48
|
|
|
@@ -51,7 +64,7 @@ Ensure `iptables` is installed on the host VPS. If `iptables` permissions are wi
|
|
|
51
64
|
Configure a cron job checking every hour on the hour under the `hermes` system user:
|
|
52
65
|
|
|
53
66
|
```cron
|
|
54
|
-
0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
|
|
67
|
+
0 * * * * set -a; . /opt/hermes/.env 2>/dev/null; set +a; cd /opt/gflow-cli && uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli >> /var/log/hermes/pr_triage.log 2>&1
|
|
55
68
|
```
|
|
56
69
|
|
|
57
70
|
Sourcing `/opt/hermes/.env` first (`set -a` exports everything it defines) is what delivers `GH_COMMENT_TOKEN`, `TELEGRAM_*`, and the `RESEND_API_KEY` / `HERMES_NOTIFY_EMAIL_*` vars to the process. Without it the email channel silently disables itself, and without `GH_COMMENT_TOKEN` the run exits 1.
|
|
@@ -83,6 +96,17 @@ Do **NOT** register the orchestrator directly via `hermes cron create --script p
|
|
|
83
96
|
- **(a) Plain crontab** — the line above, under the `hermes` system user.
|
|
84
97
|
- **(b) Thin shim in `HERMES_HOME/scripts/`** — a script that does `cd /opt/gflow-cli && exec uv run python scripts/autopilot/pr_triage_autopilot.py "$@"` (mirrors the existing EV ops-health shim pattern), registered with `hermes cron create "1h" --no-agent --script <shim> --deliver telegram`.
|
|
85
98
|
|
|
99
|
+
### Log rotation
|
|
100
|
+
|
|
101
|
+
`pr_triage.log` grows without bound otherwise. Install once, as root:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
install -m 644 /opt/gflow-cli/deploy/logrotate-pr-triage /etc/logrotate.d/pr-triage
|
|
105
|
+
logrotate --debug /etc/logrotate.d/pr-triage # dry-run
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Scoped to `pr_triage.log` alone — the rest of `/var/log/hermes/` belongs to hermes-ops, and two packages rotating one glob is how logs get silently truncated.
|
|
109
|
+
|
|
86
110
|
### Check Logs & Status
|
|
87
111
|
- **Log Location**: `/var/log/hermes/pr_triage.log`
|
|
88
112
|
- **Triage Ledger**: `/opt/gflow-cli/pr_triage_ledger.jsonl` tracks verdicts and failure states.
|
|
@@ -110,5 +134,5 @@ If a PR enters the `FAILED_PERMANENT` state in `pr_triage_ledger.jsonl` due to 3
|
|
|
110
134
|
2. Fix the underlying environmental or syntax issue.
|
|
111
135
|
3. To trigger a re-review, delete or edit the `FAILED_PERMANENT` entries for that PR number/SHA in `pr_triage_ledger.jsonl`, then run the script manually:
|
|
112
136
|
```bash
|
|
113
|
-
uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
|
|
137
|
+
uv run python scripts/autopilot/pr_triage_autopilot.py --repo-dir /opt/gflow-cli
|
|
114
138
|
```
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# logrotate config for the PR-Triage Autopilot log.
|
|
2
|
+
#
|
|
3
|
+
# Install on the VPS as root:
|
|
4
|
+
# install -m 644 /opt/gflow-cli/deploy/logrotate-pr-triage /etc/logrotate.d/pr-triage
|
|
5
|
+
# logrotate --debug /etc/logrotate.d/pr-triage # dry-run to verify
|
|
6
|
+
#
|
|
7
|
+
# Scoped to pr_triage.log alone, not /var/log/hermes/*.log: the rest of that
|
|
8
|
+
# directory belongs to hermes-ops, and two packages rotating the same glob is
|
|
9
|
+
# how you get silently truncated logs.
|
|
10
|
+
/var/log/hermes/pr_triage.log {
|
|
11
|
+
weekly
|
|
12
|
+
rotate 8
|
|
13
|
+
compress
|
|
14
|
+
delaycompress
|
|
15
|
+
missingok
|
|
16
|
+
notifempty
|
|
17
|
+
# The hourly cron reopens the file on each tick, but copytruncate keeps
|
|
18
|
+
# rotation safe if the orchestrator is ever run as a long-lived process.
|
|
19
|
+
copytruncate
|
|
20
|
+
su hermes hermes
|
|
21
|
+
}
|