gflow-cli 0.58.0__tar.gz → 0.60.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.58.0 → gflow_cli-0.60.0}/.codex-plugin/plugin.json +1 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.env.template +7 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/ci.yml +57 -7
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/deps-watch.yml +3 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/external-pr-triage.yml +9 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/governance-advisory.yml +11 -3
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/governance-benchmark.yml +2 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/main-base-guard.yml +2 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/pages.yml +2 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/release.yml +8 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/scorecard.yml +1 -1
- gflow_cli-0.60.0/.github/workflows/selector-probe.yml +26 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/AGENTS.md +1 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/CHANGELOG.md +137 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/KNOWN_ISSUES.md +6 -4
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/PKG-INFO +2 -2
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/deploy/PR-TRIAGE-AUTOPILOT-OPS.md +28 -4
- gflow_cli-0.60.0/deploy/logrotate-pr-triage +21 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/DATA_LAYER.md +24 -0
- {gflow_cli-0.58.0/website → gflow_cli-0.60.0}/docs/E2E_TESTING.md +159 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/GITHUB.md +87 -0
- gflow_cli-0.60.0/docs/INDEX.md +165 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.58.0.md +5 -2
- gflow_cli-0.60.0/docs/LIVE_VERIFICATION_v0.59.0.md +66 -0
- gflow_cli-0.60.0/docs/LIVE_VERIFICATION_v0.60.0.md +180 -0
- gflow_cli-0.60.0/docs/MEDIA_LIBRARY.md +188 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/PROJECT_STATUS.md +26 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/USAGE.md +140 -1
- gflow_cli-0.60.0/docs/superpowers/plans/2026-08-21-selector-registry.md +743 -0
- gflow_cli-0.60.0/docs/superpowers/plans/2026-08-25-workflow-hardening-gaps.md +171 -0
- gflow_cli-0.60.0/docs/superpowers/specs/2026-08-21-selector-registry-design.md +307 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/pyproject.toml +3 -3
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/autopilot/Dockerfile.triage +4 -0
- gflow_cli-0.60.0/scripts/autopilot/entrypoint.sh +10 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/autopilot/package-lock.json +48 -36
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/autopilot/package.json +1 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/autopilot/pr_triage_autopilot.py +105 -10
- gflow_cli-0.60.0/scripts/autopilot/run_sandboxed_review.sh +172 -0
- gflow_cli-0.60.0/scripts/canary/register_task.ps1 +79 -0
- gflow_cli-0.60.0/scripts/canary/run_canary.py +362 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/check_repo_hygiene.py +20 -6
- gflow_cli-0.60.0/scripts/dev/capture_project_listing.py +90 -0
- gflow_cli-0.60.0/scripts/dev/live_verify_policy_400_v060.py +142 -0
- gflow_cli-0.60.0/scripts/dev/spike_trpc_origin_referer_401.py +151 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/diag/README.md +1 -0
- gflow_cli-0.60.0/scripts/diag/diag_aisandbox_bearer.py +124 -0
- gflow_cli-0.60.0/scripts/probe/run_probe.py +210 -0
- gflow_cli-0.60.0/scripts/probe/spike_auth_matrix.py +131 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/client.py +145 -61
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/_common.py +54 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/base.py +38 -2
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/bearer.py +2 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +2 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +2 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/ui_automation.py +109 -28
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/ui_automation_video.py +72 -10
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli.py +2 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_data.py +257 -2
- gflow_cli-0.60.0/src/gflow_cli/cli_doctor.py +86 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_image.py +134 -2
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_video.py +15 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/redaction.py +3 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/repository.py +172 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/store.py +79 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/diagnostics.py +72 -13
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/errors.py +105 -1
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/__init__.py +1 -0
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/grading.py +51 -0
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/model.py +59 -0
- gflow_cli-0.60.0/src/gflow_cli/flow_selectors/registry.py +63 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/json_output.py +23 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/observability.py +14 -4
- gflow_cli-0.60.0/src/gflow_cli/services/catalog_sync.py +382 -0
- gflow_cli-0.60.0/src/gflow_cli/services/doctor.py +529 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_post_json_aisandbox_auth.py +74 -0
- gflow_cli-0.60.0/tests/api/transports/test_policy_400.py +185 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation.py +16 -3
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_batch.py +8 -8
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_video.py +234 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/autopilot/test_pr_triage_autopilot.py +344 -2
- gflow_cli-0.60.0/tests/cli/test_cli_data_sync.py +243 -0
- gflow_cli-0.60.0/tests/cli/test_cli_doctor.py +264 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_uuid_ref_enrichment.py +122 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/conftest.py +31 -2
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_redaction.py +7 -0
- gflow_cli-0.60.0/tests/data/test_repository.py +804 -0
- gflow_cli-0.60.0/tests/data/test_store.py +160 -0
- gflow_cli-0.60.0/tests/e2e/test_data_sync_names_e2e.py +208 -0
- gflow_cli-0.60.0/tests/e2e/test_refresh_on_miss_e2e.py +164 -0
- gflow_cli-0.60.0/tests/fixtures/doctor_env.py +58 -0
- gflow_cli-0.60.0/tests/fixtures/listing_payload.py +107 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_grading.py +67 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_model.py +37 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_registry.py +47 -0
- gflow_cli-0.60.0/tests/flow_selectors/test_report.py +57 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_cli_parity.py +2 -0
- gflow_cli-0.60.0/tests/scripts/test_canary_classify.py +326 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_check_repo_hygiene.py +46 -2
- gflow_cli-0.60.0/tests/scripts/test_workflow_hardening.py +203 -0
- gflow_cli-0.60.0/tests/services/test_catalog_sync.py +572 -0
- gflow_cli-0.60.0/tests/services/test_doctor.py +577 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_errors_classification.py +9 -8
- gflow_cli-0.60.0/tests/test_incident_generation_requests.py +94 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_self_documenting_errors.py +34 -5
- gflow_cli-0.60.0/tests/tools/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/uv.lock +53 -53
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/DATA_LAYER.md +24 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0/website}/docs/E2E_TESTING.md +159 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/KNOWN_ISSUES.md +6 -4
- gflow_cli-0.60.0/website/docs/MEDIA_LIBRARY.md +188 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/USAGE.md +140 -1
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/mkdocs.yml +1 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/requirements.txt +3 -3
- gflow_cli-0.58.0/docs/INDEX.md +0 -155
- gflow_cli-0.58.0/scripts/autopilot/entrypoint.sh +0 -9
- gflow_cli-0.58.0/scripts/autopilot/run_sandboxed_review.sh +0 -115
- gflow_cli-0.58.0/tests/data/test_repository.py +0 -418
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.agents/plugins/marketplace.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/README.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/issue-assessment.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/issue-resolve.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/live-verify.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/llm-council.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.gitattributes +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.github/workflows/labels.yml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.gitignore +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/.secrets.baseline +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/CLAUDE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/LICENSE +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/README.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/RELEASE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/ROADMAP.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/conftest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docker-compose.yml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/ASSET_TAGGING_RECON.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_playwright_1.61.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.22.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.23.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.24.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.25.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.26.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.27.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.27.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.28.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.29.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.30.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.31.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.32.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.32.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.33.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.34.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.35.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.36.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.37.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.38.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.38.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.39.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.40.0-production-readiness.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.40.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.41.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.42.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.43.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.44.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.45.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.46.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.46.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.47.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.48.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.49.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.50.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.51.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.52.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.54.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.55.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.56.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.57.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.57.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/MCP.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/REFERENCE_STRATEGIES.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-08-pr-triage-autopilot/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-09-camoufox-adoption/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-14-storyboarding-and-visual-curation/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-18-asset-tagging/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-live-verify/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-browser-lifecycle.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-driver-cdp-verification.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-public-truth.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-19-production-readiness-queue-safety.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-character-prompt-polishing/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-project-name-management/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-26-self-documenting-errors/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-overlay-banner-dismissal/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-07-27-tier-aware-credit-confirmations/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-04-mcp-tasks/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-04-output-hardening/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-317-intra-batch-references/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-402-entity-provenance/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-05-issue-451-duration-tab-drift/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-driver-delay-jittering/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-overlay-changelog-watermark/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-06-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/PLAN.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/plans/2026-08-14-video-ui-mode-policy/SCENARIO.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-04-pr-triage-autopilot-design.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-18-asset-tagging-design.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-19-live-verify-design.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/specs/2026-07-19-production-readiness-hardening-design.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-09-camoufox-waf-403.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-12-ui-cohort-backend-config.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-07-17-production-readiness-assessment.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-01-mcp-2026-07-28-spec-impact.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-14-video-model-capability-matrix.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/docs/superpowers/spikes/2026-08-15-picker-tile-alt-text.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/eval/pr_triage_eval.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/eval/pr_triage_fixtures.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/README.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/index.html +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/llms.txt +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/README.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/autopilot/pr_triage_gate.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/check_release_artifacts.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/check_test_count.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/check_website_docs_pii.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/ci/generate_website_docs.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_frames_mode_trigger_ligature.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_lower_priority_model_cost.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_r2v_ingredient_lifecycle.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_sidebar_state_dom.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/capture_video_model_capability_matrix.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/incident_bundle_quality.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/live_verify_mcp_tasks.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/sonar-local-scan.sh +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/sonar-pre-push-gate.sh +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_character_prompt_format.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_incident_live.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue313_agent_mode_controls.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue314_picker_filename_search.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_issue404_count_tabs_recon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_mode_roundtrip.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_mode_switch_agentic_to_classic.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_omni_flash_i2v_ui_recon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/diag/spike_387_openai_compat.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/spike_waf_camoufox.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/README.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/changelog/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/check/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/doc-review/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/issue-assessment/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/issue-resolve/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/known-issues/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/live-verify/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/llm-council/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/release/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/sonar/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/sonar-project.properties +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/transports/mode_control.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/browser_manager.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_instructions.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_project.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/0009_queue_claims.sql +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/file_integrity.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/setup.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/tasks_extension.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/mcp/tools.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/profile_lease.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/redaction.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/services/mentions.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/reverse-engineer.toml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/builtin/storyboard.toml +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/update_check.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/winsec.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/codec.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/daemon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_errors.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_incidents.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_classic.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/drivers/test_ui_mode.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_agentic_cohort_detection.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_mode_control.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_selector_symmetry.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/auth/test_cookies.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/auth/test_real_chrome.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/auth/test_windows_acl.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_auth_status.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_errors.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_data_errors_retention.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_instructions.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_failure_funnel.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_incident_output.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_movie_manifest_style_variants.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_predictable_output.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/composition/test_style_variants.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/composition/test_style_variants_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_failure_recording.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_agentic_count_enforcement_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_asset_tagging_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_cancellation_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_classic_count_setter_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_crash_recovery_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_entity_provenance_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_entity_smuggling_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_image_uuid_ref_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_incident_quality_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_live_agentic_instructions.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_project_naming_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_sidebar_recovery_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_video_r2v_uuid_name_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/asset_tagging.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/duration_tab_drift.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/entity_provenance.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/image_batch_references.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/incident_diagnostics.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/instructions.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/mcp_tasks.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/media_picker_tiers.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/output_hardening.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_asset_tagging_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_incident_diagnostics_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_instructions_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_mcp_tasks_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_media_picker_tiers_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_output_hardening_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.58.0/tests/image_batch → gflow_cli-0.60.0/tests/flow_selectors}/__init__.py +0 -0
- {gflow_cli-0.58.0/tests/integration → gflow_cli-0.60.0/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/image_batch/test_jitter_config.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.58.0/tests/services → gflow_cli-0.60.0/tests/integration}/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/integration/test_expander_gateway.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_auth_status_tool.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_error_funnel.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_http_transport.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_known_issues_resource.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_no_spend.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_rate_limit_envelope.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_resources.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_server.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_setup.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_tasks_extension.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_helpers.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_instructions.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/mcp/test_tools_wired.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_check_release_artifacts.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_check_test_count.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_check_website_docs_pii.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_codex_plugin.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_generate_website_docs.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_incident_bundle_quality.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.58.0/tests/smoke → gflow_cli-0.60.0/tests/services}/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_mentions_observability.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_mentions_parse.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_mentions_resolve.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/services/test_resolve_and_apply.py +0 -0
- {gflow_cli-0.58.0/tests/tools → gflow_cli-0.60.0/tests/smoke}/__init__.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_cli_project.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_config.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_diagnostics_bundle.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_diagnostics_events.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_diagnostics_journal.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_diagnostics_recorder.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_diagnostics_retention.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_diagnostics_sanitize.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_duration_tab_drift.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_entity_provenance.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_image_batch_references.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_media.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_overlay_banner_dismissal.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_playwright_pin.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_profile_lease.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_profile_lease_subprocess.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/test_update_check.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/ui/test_app.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/worker/test_codec.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/worker/test_daemon.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/worker/test_mcp_daemon_race.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/worker/test_queue.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/worker/test_queue_multiprocess.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/tests/worker/test_queue_reconciliation.py +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/CHARACTER.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/INSTRUCTIONS.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/MCP.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/MOVIE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/SECURITY.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/TOOLS.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/agents.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/index.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/installation.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/onboarding-mockup.html +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/onboarding.md +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/docs/stylesheets/extra.css +0 -0
- {gflow_cli-0.58.0 → gflow_cli-0.60.0}/website/requirements.in +0 -0
|
@@ -143,6 +143,13 @@
|
|
|
143
143
|
# editable/source installs. Set to 0 to disable.
|
|
144
144
|
# GFLOW_CLI_UPDATE_CHECK=1
|
|
145
145
|
|
|
146
|
+
# Whether generation prompts (and the prompt-derived display names used as the
|
|
147
|
+
# picker search key) are stored in the local catalog — store | redacted.
|
|
148
|
+
# Under 'redacted', `gflow doctor` reports missing display names as info
|
|
149
|
+
# (backfill is deliberately suppressed) instead of warn, and name backfill via
|
|
150
|
+
# `gflow data sync --names` requires switching back to 'store' first.
|
|
151
|
+
# GFLOW_CLI_HISTORY_PROMPTS=store
|
|
152
|
+
|
|
146
153
|
# MCP no-spend mode (#496): when set to 1, the MCP server (gflow mcp run AND
|
|
147
154
|
# gflow serve) never registers the credit-spending generate tools — agents
|
|
148
155
|
# cannot see them in tools/list. Equivalent to the --no-spend flag.
|
|
@@ -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
|
|
@@ -58,7 +58,7 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
58
58
|
|
|
59
59
|
- Type hints everywhere; `pyright` strict on `src/gflow_cli`.
|
|
60
60
|
- Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
|
|
61
|
-
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–31, e.g. 11 is `ConfigurationError` — including `ProfileLockedError` for same-profile lease contention, 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`, 25 `FlowAgentUiError`, 28 `UiModeUnavailableError`, 29 `MentionIndexUnavailableError`, 30 `QueueSchemaError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
|
|
61
|
+
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–31, e.g. 11 is `ConfigurationError` — including `ProfileLockedError` for same-profile lease contention, 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`, 25 `FlowAgentUiError`, 28 `UiModeUnavailableError`, 29 `MentionIndexUnavailableError`, 30 `QueueSchemaError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping. Exit 33 is reserved outside that map: `gflow doctor` findings-present — a successful diagnosis, not an error class.
|
|
62
62
|
- 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
|
|
63
63
|
- **YAGNI / least-code**: prefer the smallest change that works. No speculative abstractions (interface/factory with one implementation), no config or flags nobody sets, no dead constants/helpers, no reinventing the stdlib. Review carries this as its own lens — the **D14 over-engineering** dimension of [`pr-council-review`](skills/pr-council-review/SKILL.md) (baseline, always runs). Its rubric is portable; the `ponytail` plugin (see CONTRIBUTING) is an optional accelerant, not a dependency.
|
|
64
64
|
- **MCP & CLI Schema Symmetry**: Any updates or additions to user-facing CLI command parameters (e.g., `gflow image t2i`, `gflow video`) must be mirrored in the corresponding MCP tool definitions. Never add option/argument fields to Click commands without updating the MCP server implementation. This symmetry is enforced programmatically in CI via `tests/mcp/test_cli_parity.py` (every CLI leaf command needs a mapped MCP tool or an explicit, reasoned exemption) plus the schema checks in `tests/mcp/test_server.py`.
|
|
@@ -7,6 +7,140 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.60.0] — 2026-08-25
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Selector registry + nightly CI drift probe
|
|
15
|
+
([#404](https://github.com/ffroliva/gflow-cli/issues/404),
|
|
16
|
+
[#493](https://github.com/ffroliva/gflow-cli/issues/493),
|
|
17
|
+
[#313](https://github.com/ffroliva/gflow-cli/issues/313)).** New
|
|
18
|
+
`gflow_cli.flow_selectors` package: a structured, enumerable inventory of the
|
|
19
|
+
Flow DOM selectors gflow depends on (`Surface`, `Selector`) plus a pure
|
|
20
|
+
grader (`HIT` / `FALLBACK` / `AMBIGUOUS` / `MISS` / `EXPECTED_ABSENT`), so
|
|
21
|
+
selector drift is *named* rather than inferred from a failing test. A $0
|
|
22
|
+
probe (`scripts/probe/run_probe.py`, driven by the `selector-probe` workflow
|
|
23
|
+
on `schedule` + `workflow_dispatch` only) walks the registry against a live
|
|
24
|
+
editor: navigate and read only, never generates. Exit 0 clean / 1 drift /
|
|
25
|
+
2 inconclusive — an expired token or dead project is never published as
|
|
26
|
+
drift.
|
|
27
|
+
|
|
28
|
+
- **Incident bundles record what was submitted
|
|
29
|
+
([#528](https://github.com/ffroliva/gflow-cli/issues/528)).**
|
|
30
|
+
`network.json` gains a `generation_requests` array carrying a counts-only
|
|
31
|
+
summary of each outgoing generation submit (body size, reference-entity
|
|
32
|
+
count, reference-field count). The reference shape that triggers a policy 400
|
|
33
|
+
was previously visible only in the stderr stream, so bundles attached to an
|
|
34
|
+
issue could not be diagnosed. Counts and booleans only — no key names, field
|
|
35
|
+
values, or prompt text — matching the existing §5.3 retention boundary.
|
|
36
|
+
|
|
37
|
+
### Changed
|
|
38
|
+
|
|
39
|
+
- **All labs.google requests now carry `origin`/`referer`
|
|
40
|
+
([#578](https://github.com/ffroliva/gflow-cli/pull/578)).** Header
|
|
41
|
+
construction moved into a single `_request_headers()` shared by
|
|
42
|
+
`_post_json`/`_patch_json`/`_get_json`, which previously assembled headers
|
|
43
|
+
inline three times and could diverge per verb. The labs lane now sends the
|
|
44
|
+
same `origin`/`referer` every other lane already sent. A live A/B against
|
|
45
|
+
`project.createProject` showed these headers are **not** required — an
|
|
46
|
+
origin-less mutation still returns 200 — so this is consistency and
|
|
47
|
+
defence-in-depth, not a fix for any observed failure.
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **Content-policy 400s are no longer misclassified as `WireFormatError`
|
|
52
|
+
([#528](https://github.com/ffroliva/gflow-cli/issues/528)).** An HTTP 400 from
|
|
53
|
+
`flowMedia:batchGenerateImages` or `batchAsyncGenerateVideo*` now raises
|
|
54
|
+
`ContentPolicyError` with remediation that names the levers that actually
|
|
55
|
+
work — reduce to a single face-bearing reference, replace age-explicit person
|
|
56
|
+
descriptors with relational or role nouns — and states outright that
|
|
57
|
+
shortening the prompt does not help. Previously these surfaced as "the
|
|
58
|
+
request was rejected as malformed… retry with a simpler prompt text", which
|
|
59
|
+
sends operators down a path that cannot succeed. Same defect shape as
|
|
60
|
+
[#379](https://github.com/ffroliva/gflow-cli/issues/379) (429), one status
|
|
61
|
+
over, and the self-documenting-errors goal of
|
|
62
|
+
[#380](https://github.com/ffroliva/gflow-cli/issues/380).
|
|
63
|
+
- **Video generation gained the 429 branch the image path got in #379.** A
|
|
64
|
+
quota hit on `batchAsyncGenerateVideo*` raised `WireFormatError` instead of
|
|
65
|
+
`RateLimitError`, losing `Retry-After` and the retryable classification.
|
|
66
|
+
- **`generate_images_batch` no longer reports a bare, remediation-free
|
|
67
|
+
`GFlowError`** when every response failed — it classifies the first error the
|
|
68
|
+
same way the single-prompt path does.
|
|
69
|
+
|
|
70
|
+
### Security
|
|
71
|
+
|
|
72
|
+
- **CI/CD supply-chain hardening
|
|
73
|
+
([#565](https://github.com/ffroliva/gflow-cli/issues/565)).** Every
|
|
74
|
+
`actions/checkout` step now sets `persist-credentials: false` (12 existing
|
|
75
|
+
steps fixed across `ci.yml`, `deps-watch.yml`, `governance-advisory.yml`,
|
|
76
|
+
`governance-benchmark.yml`, `main-base-guard.yml`, `pages.yml` and
|
|
77
|
+
`release.yml`); the default leaves the job token in `.git/config` for the rest
|
|
78
|
+
of the job. No workflow needed it — releases publish over PyPI Trusted
|
|
79
|
+
Publishing (OIDC) and Pages deploys over `actions/deploy-pages`. A new
|
|
80
|
+
`workflow-audit` job runs [zizmor](https://github.com/zizmorcore/zizmor)
|
|
81
|
+
(pinned, `--offline`) over `.github/workflows/` on every push and PR, so the
|
|
82
|
+
class cannot come back. Its first run also caught two defects the manual pass
|
|
83
|
+
missed: `${{ github.base_ref }}` interpolated directly into a
|
|
84
|
+
`governance-advisory.yml` shell script (template injection — the value now
|
|
85
|
+
arrives through `env:`), and a shared uv cache restored by the publishing
|
|
86
|
+
release job (cache poisoning — caching is now off there). The
|
|
87
|
+
`pull_request_target` trigger in `external-pr-triage.yml` is suppressed inline
|
|
88
|
+
with its rationale, and a changelog-guard workflow was evaluated and declined
|
|
89
|
+
— both decisions recorded in
|
|
90
|
+
[docs/GITHUB.md § Workflow Security Gates](docs/GITHUB.md#workflow-security-gates).
|
|
91
|
+
|
|
92
|
+
## [0.59.0] — 2026-08-16
|
|
93
|
+
|
|
94
|
+
### Added
|
|
95
|
+
|
|
96
|
+
- **Refresh-on-miss: stale catalog names self-heal during generation
|
|
97
|
+
([#546](https://github.com/ffroliva/gflow-cli/issues/546)).** When a UUID
|
|
98
|
+
reference's picker name-search misses (e.g. the asset was renamed in the
|
|
99
|
+
Flow UI after being cataloged), the transport now consults the credit-free
|
|
100
|
+
`flow.projectInitialData` listing once (~0.5 s) for the *current* name,
|
|
101
|
+
retries the search exactly once, and attaches the existing tile — instead
|
|
102
|
+
of silently downgrading to a duplicate upload. The fresh name is written
|
|
103
|
+
back with `sync.source = "refresh"` provenance (`store` history mode only;
|
|
104
|
+
`redacted` heals the run without touching disk). Applies to `image i2i
|
|
105
|
+
--ref <uuid>` and `video i2v` frame refs; any resolver failure is logged
|
|
106
|
+
and the pre-existing fallback chain proceeds unchanged. Completes the
|
|
107
|
+
[#543](https://github.com/ffroliva/gflow-cli/issues/543) freshness model —
|
|
108
|
+
see [MEDIA_LIBRARY § freshness](docs/MEDIA_LIBRARY.md).
|
|
109
|
+
|
|
110
|
+
- **`gflow doctor` — read-only pre-flight diagnostics
|
|
111
|
+
([#542](https://github.com/ffroliva/gflow-cli/issues/542)).** Ten checks
|
|
112
|
+
across the catalog (missing display names / local files / sha256), the
|
|
113
|
+
database (migration drift, WAL state + `PRAGMA quick_check`), stuck
|
|
114
|
+
operations and queue tasks (24h recency threshold), and the environment
|
|
115
|
+
(deprecated env vars, missing Playwright Chromium, auth profiles without
|
|
116
|
+
cookies). Brew-doctor philosophy: diagnoses, never heals — nothing is
|
|
117
|
+
migrated, repaired, or written, and all DB access is strictly read-only.
|
|
118
|
+
Exit `0` when clean, `33` when any warn/fail finding is present (a
|
|
119
|
+
successful diagnosis, not an error class); internal errors keep their typed
|
|
120
|
+
codes (e.g. `16` for `DataStoreError`). `--json` emits an experimental
|
|
121
|
+
machine-readable envelope (`overall_status` + per-check `checks[]` entries).
|
|
122
|
+
Output is redaction-safe: rows are identified by UUID only, paths are
|
|
123
|
+
sanitized, and under `GFLOW_CLI_HISTORY_PROMPTS=redacted` the display-name
|
|
124
|
+
check reports info instead of warn. See
|
|
125
|
+
[USAGE § `gflow doctor`](docs/USAGE.md#gflow-doctor).
|
|
126
|
+
|
|
127
|
+
- **`gflow data sync --names` — reconcile catalog display names from Flow's
|
|
128
|
+
listing endpoint ([#543](https://github.com/ffroliva/gflow-cli/issues/543)).**
|
|
129
|
+
Sweeps nameless catalog rows project-by-project via the credit-free
|
|
130
|
+
`flow.projectInitialData` listing (~0.5s/project, session-cookie auth, no
|
|
131
|
+
generation surface) and writes back the display names the picker searches
|
|
132
|
+
by — restoring the [#529](https://github.com/ffroliva/gflow-cli/issues/529)
|
|
133
|
+
picker contract (search by name, verify by UUID) for rows recorded before
|
|
134
|
+
their caption existed. Rows whose media no longer exists remotely are
|
|
135
|
+
ghost-marked `sync.status = "missing_remote"` (tombstones, never deletions)
|
|
136
|
+
only when the listing is provably complete. Write-by-default with
|
|
137
|
+
`--dry-run` preview; scoped via `--project` / `--limit` / `--since` /
|
|
138
|
+
`--max-projects`; idempotent re-runs. Refuses under
|
|
139
|
+
`GFLOW_CLI_HISTORY_PROMPTS=redacted` (exit `11`); exit `34`
|
|
140
|
+
(`SyncPartialError`, retryable) when some projects fail mid-sweep. This is
|
|
141
|
+
the remediation `gflow doctor`'s missing-display-name check points at. See
|
|
142
|
+
[USAGE § `gflow data sync`](docs/USAGE.md#gflow-data-sync).
|
|
143
|
+
|
|
10
144
|
## [0.58.0] — 2026-08-16
|
|
11
145
|
|
|
12
146
|
### Fixed
|
|
@@ -3021,7 +3155,9 @@ shell-script template that branches on these codes.
|
|
|
3021
3155
|
|
|
3022
3156
|
First skeleton. Not functional end-to-end yet.
|
|
3023
3157
|
|
|
3024
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
3158
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.60.0...HEAD
|
|
3159
|
+
[0.60.0]: https://github.com/ffroliva/gflow-cli/compare/v0.59.0...v0.60.0
|
|
3160
|
+
[0.59.0]: https://github.com/ffroliva/gflow-cli/compare/v0.58.0...v0.59.0
|
|
3025
3161
|
[0.58.0]: https://github.com/ffroliva/gflow-cli/compare/v0.57.1...v0.58.0
|
|
3026
3162
|
[0.57.1]: https://github.com/ffroliva/gflow-cli/compare/v0.57.0...v0.57.1
|
|
3027
3163
|
[0.57.0]: https://github.com/ffroliva/gflow-cli/compare/v0.56.0...v0.57.0
|
|
@@ -142,7 +142,7 @@ full-page media-library UI (#174) can fail earlier at `mode_switch_trigger`.
|
|
|
142
142
|
|
|
143
143
|
### Fresh generations may record without a `display_name` (async Flow caption)
|
|
144
144
|
|
|
145
|
-
- **Status:**
|
|
145
|
+
- **Status:** Mitigated — remedies shipped via [#543](https://github.com/ffroliva/gflow-cli/issues/543) and [#542](https://github.com/ffroliva/gflow-cli/issues/542)
|
|
146
146
|
- **Affected:** UUID `--ref` / frame references to *just-generated* assets (v0.58.0+)
|
|
147
147
|
|
|
148
148
|
Flow computes an asset's caption (`displayName`) asynchronously server-side, so
|
|
@@ -151,9 +151,11 @@ stores no name (observed live 2026-08-16 during the r2v e2e). Such rows skip
|
|
|
151
151
|
the picker-selection path and use the integrity-verified local-file upload
|
|
152
152
|
fallback instead — correct but a duplicate upload. Also by design, rows
|
|
153
153
|
recorded before v0.58.0 and all rows under
|
|
154
|
-
`GFLOW_CLI_HISTORY_PROMPTS=redacted` have no stored name.
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
`GFLOW_CLI_HISTORY_PROMPTS=redacted` have no stored name. **Remedies:**
|
|
155
|
+
`gflow data sync --names` (#543) backfills names credit-free from the Flow
|
|
156
|
+
listing endpoint (privacy-gated to `store` history mode), and `gflow doctor`
|
|
157
|
+
(#542) surfaces the affected-row count. Freshly generated rows whose caption
|
|
158
|
+
has not landed yet stay nameless until the next sync sweep.
|
|
157
159
|
|
|
158
160
|
### Video duration tab probe misses on the current Frames-submode DOM
|
|
159
161
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.60.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
|
+
}
|
|
@@ -69,6 +69,30 @@ same treatment `character create` already gave them. Keep that in mind before
|
|
|
69
69
|
adding a key here: anything prompt-derived must be hashed by its own builder
|
|
70
70
|
(as `tool` does) rather than relying on column-level redaction.
|
|
71
71
|
|
|
72
|
+
### Asset `metadata_json.sync.*` provenance (#543)
|
|
73
|
+
|
|
74
|
+
`assets.metadata_json` carries a `sync` object recording what
|
|
75
|
+
`gflow data sync --names` did to the row and when — so a restored name is
|
|
76
|
+
distinguishable from one recorded at generation time, and a ghost mark carries
|
|
77
|
+
its own audit trail:
|
|
78
|
+
|
|
79
|
+
| Key | Shape | Writer |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `sync.named_at` | UTC ISO timestamp | `DataRepository.set_asset_display_name` — set (with `$.display_name`) when a sync sweep writes or overwrites the name; skipped when the stored name is already identical, so re-runs never churn the timestamp |
|
|
82
|
+
| `sync.source` | `"sync"` \| `"refresh"` | Same writer, same statement — provenance for the name value: `"sync"` from a bulk `gflow data sync --names` sweep; `"refresh"` from the refresh-on-miss resolver (#546, `cli_image`), which writes back the freshly fetched name after a picker miss |
|
|
83
|
+
| `sync.status` | `"missing_remote"` | `DataRepository.mark_asset_missing_remote` — the ghost tombstone, set only when a **complete** remote listing lacks the asset; rows are flagged, never deleted, and tombstoned rows are excluded from later sweeps; cleared automatically if the media reappears in a listing |
|
|
84
|
+
| `sync.checked_at` | UTC ISO timestamp | Same writer — when the absence was last confirmed |
|
|
85
|
+
|
|
86
|
+
All four are written via single-statement atomic `json_set` updates that
|
|
87
|
+
preserve unrelated metadata keys. See
|
|
88
|
+
[USAGE § `gflow data sync`](USAGE.md#gflow-data-sync).
|
|
89
|
+
|
|
90
|
+
Two caveats: an in-flight generation's recorder completion can overwrite
|
|
91
|
+
`metadata_json` written concurrently by a sync sweep — self-healing, since the
|
|
92
|
+
row simply re-enters the next sweep. And the nested `sync.*` stamps rely on
|
|
93
|
+
SQLite's `json_set` auto-creating intermediate objects; a very old system
|
|
94
|
+
SQLite (pre-json1 era, roughly < 3.9) may silently no-op them.
|
|
95
|
+
|
|
72
96
|
### What is NOT recorded
|
|
73
97
|
|
|
74
98
|
- Signed CDN URLs (e.g., `fifeUrl?Signature=...`) — they expire and contain bearer-style tokens.
|