gflow-cli 0.22.0__tar.gz → 0.23.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.23.0/.claude/commands/gflow/issue-assessment.md +28 -0
- gflow_cli-0.23.0/.claude/commands/gflow/issue-resolve.md +18 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/ci.yml +5 -2
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/AGENTS.md +9 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CHANGELOG.md +56 -1
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/GEMINI.md +1 -1
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/KNOWN_ISSUES.md +22 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/PKG-INFO +2 -2
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/PLAN.md +1 -1
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/INDEX.md +1 -2
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.22.0.md +36 -2
- gflow_cli-0.23.0/docs/LIVE_VERIFICATION_v0.23.0.md +76 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/MCP.md +4 -4
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/PROJECT_STATUS.md +19 -1
- gflow_cli-0.23.0/docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md +143 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/pyproject.toml +3 -3
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_patchright.py +9 -2
- gflow_cli-0.23.0/skills/issue-assessment/SKILL.md +142 -0
- gflow_cli-0.23.0/skills/issue-resolve/SKILL.md +123 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/client.py +224 -4
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/ui_automation.py +10 -9
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/cookies.py +36 -3
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/browser_manager.py +112 -12
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli.py +21 -1
- gflow_cli-0.23.0/src/gflow_cli/mcp/tools.py +781 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/worker/daemon.py +132 -34
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_image.py +47 -0
- gflow_cli-0.23.0/tests/api/test_client_launch_kwargs.py +310 -0
- gflow_cli-0.23.0/tests/auth/test_cookies.py +51 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/dev/test_recording_client.py +1 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/test_server.py +106 -18
- gflow_cli-0.23.0/tests/mcp/test_tools_wired.py +440 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_browser_manager.py +89 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/worker/test_daemon.py +108 -19
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/uv.lock +25 -25
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +0 -117
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +0 -110
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +0 -66
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +0 -233
- gflow_cli-0.22.0/src/gflow_cli/mcp/tools.py +0 -340
- gflow_cli-0.22.0/tests/api/test_client_launch_kwargs.py +0 -77
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/pr-council-review.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/release.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/sonar.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.env.template +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.gitattributes +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/governance-advisory.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/governance-benchmark.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/main-base-guard.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.gitignore +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/.secrets.baseline +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CLAUDE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/LICENSE +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/RELEASE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/ROADMAP.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docker-compose.yml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.21.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/PROMPT_EXPANSION.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/TOOLS.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/USAGE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/assets/examples.webp +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/medium_tutorial.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/sonar-cleanup-tracker.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/llms.txt +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/README.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/sonar-project.properties +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/agentic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/classic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/drivers/factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/transports/ui_automation_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/api/video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/chain_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_movie.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_tools.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/cli_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/composition.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0007_queue.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/recorder.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/repository.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/errors.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/image_batch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/prompts.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/resources.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/mcp/server.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/movie_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/banned.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/builtin/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/builtin/creative-director.toml +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/expander.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/invocation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/loader.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/registry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/runtime.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/tools/spec.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/ui/app.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/ui/server.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/src/gflow_cli/worker/queue.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_tools.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_video.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/cli/test_t2i_multi_prompt.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_recorder.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/data/test_store_migrations.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_daemon_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_tools_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/fixtures/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/image_batch/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/conftest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/mcp/test_stdio_transport.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_config.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_media.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/test_smoke.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/__init__.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_banned.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_expander.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_invocation.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_loader.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_registry.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_runtime.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/tools/test_spec.py +0 -0
- {gflow_cli-0.22.0 → gflow_cli-0.23.0}/tests/ui/test_app.py +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >
|
|
3
|
+
Triage a gflow-cli GitHub issue: verify the reporter's claim against code,
|
|
4
|
+
tests, docs, KNOWN_ISSUES, and memory; classify it (CONFIRMED / NEEDS-E2E /
|
|
5
|
+
NEEDS-INFO / DUPLICATE / INVALID / WONTFIX); judge whether it is verifiable
|
|
6
|
+
end-to-end in the current environment; and draft a reporter-facing reply.
|
|
7
|
+
Read-only — changes nothing and posts nothing on its own.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# `/gflow:issue-assessment [issue number or URL]`
|
|
11
|
+
|
|
12
|
+
**Read `skills/issue-assessment/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the issue to assess.
|
|
13
|
+
|
|
14
|
+
> Do **not** call `Skill(skill="issue-assessment")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not Skill-tool-invocable (only `.claude/commands/gflow/*` are). Read the file directly instead.
|
|
15
|
+
|
|
16
|
+
The skill at `skills/issue-assessment/SKILL.md` ingests the issue, verifies the
|
|
17
|
+
claim (dispatching a search agent to keep context clean), assigns one verdict,
|
|
18
|
+
applies the **e2e-gate** (never claim a fix is verified on an unverifiable
|
|
19
|
+
surface), and emits a standard report artifact. On a `CONFIRMED` / `LIKELY-BUG`
|
|
20
|
+
verdict with localized, verifiable scope it hands off to `issue-resolve`;
|
|
21
|
+
otherwise it replies only.
|
|
22
|
+
|
|
23
|
+
**Typical chain:**
|
|
24
|
+
```
|
|
25
|
+
/gflow:issue-assessment <N> → verdict + e2e-gate + reply artifact
|
|
26
|
+
↓ (if scope clear & verifiable)
|
|
27
|
+
issue-resolve <N> → worktree + TDD + draft PR for human review
|
|
28
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: >
|
|
3
|
+
Drive an assessed gflow-cli issue (verdict CONFIRMED-BUG or LIKELY-BUG, with
|
|
4
|
+
localized verifiable scope) to a fix: isolated worktree off develop, test-first
|
|
5
|
+
fix, /gflow:check, then a DRAFT PR for human review. Mutating and gated — runs
|
|
6
|
+
inside a strict action envelope (never merges, never spends credits, never
|
|
7
|
+
marks a PR ready, never claims an unverified fix verified).
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# `/gflow:issue-resolve [issue number]`
|
|
11
|
+
|
|
12
|
+
**Read `skills/issue-resolve/SKILL.md` and follow its protocol now**, passing `$ARGUMENTS` as the issue to resolve.
|
|
13
|
+
|
|
14
|
+
> Do **not** call `Skill(skill="issue-resolve")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not Skill-tool-invocable (only `.claude/commands/gflow/*` are). Read the file directly instead.
|
|
15
|
+
|
|
16
|
+
Preconditions (from `/gflow:issue-assessment`): verdict ∈ {`CONFIRMED-BUG`, `LIKELY-BUG`}, scope single-surface, and the fix is verifiable in this environment (or the gap is carried into the PR as "needs human e2e"). The skill isolates a `bugfix/` worktree off `develop`, gates high-stakes changes through `/gflow:predict` + `/gflow:scenario`, fixes test-first (Opus plans → Sonnet codes → Opus reviews for non-trivial work), runs `/gflow:check`, opens a **draft** PR with a Verification-status section, runs `/gflow:pr-council-review`, and **stops** for a human to promote and merge.
|
|
17
|
+
|
|
18
|
+
**Chain:** `/gflow:issue-assessment <N>` → (if scope clear) `/gflow:issue-resolve <N>` → human promotes draft → human runs any headed/e2e check → merge.
|
|
@@ -93,10 +93,13 @@ jobs:
|
|
|
93
93
|
runs-on: ubuntu-latest
|
|
94
94
|
needs: test # wait for tests + coverage report
|
|
95
95
|
# Forked pull_request runs do not receive repository secrets, so SONAR_TOKEN
|
|
96
|
-
# is empty there and the scanner fails before analysis.
|
|
97
|
-
#
|
|
96
|
+
# is empty there and the scanner fails before analysis. Dependabot-triggered
|
|
97
|
+
# runs are the same case: GitHub serves them the separate Dependabot secrets
|
|
98
|
+
# namespace, so SONAR_TOKEN is also empty even though the branch is in-repo.
|
|
99
|
+
# Keep SonarCloud on trusted pushes/internal PRs where the token is available.
|
|
98
100
|
if: >
|
|
99
101
|
always() &&
|
|
102
|
+
github.actor != 'dependabot[bot]' &&
|
|
100
103
|
(
|
|
101
104
|
github.event_name != 'pull_request' ||
|
|
102
105
|
github.event.pull_request.head.repo.full_name == github.repository
|
|
@@ -69,6 +69,15 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
69
69
|
- Run `/gflow:check` (or the Impeccable Routine) before every commit.
|
|
70
70
|
- All releases require a signed annotated tag (`git tag -s vX.Y.Z`); CI rejects unsigned tags.
|
|
71
71
|
|
|
72
|
+
## Working discipline — verify before you act
|
|
73
|
+
|
|
74
|
+
These rules exist because docs alone don't bind under momentum: a "check open PRs first" rule was already written and still got skipped, and a PR was merged without seeing an entangled open one. Follow them on every task.
|
|
75
|
+
|
|
76
|
+
- **Check what's already in flight before coding a fix, opening a PR, or merging.** Run `gh pr list` and `git ls-remote` first — another open PR may already touch the same issue or files. Reconcile against it; don't re-derive "the only thing left" from a stale handoff. (A `PreToolUse` hook also surfaces same-issue open PRs at `gh pr create`/`merge` time, but treat that as a backstop, not a substitute for looking.)
|
|
77
|
+
- **Truth is the CLI and running the code — not IDE/LSP "reminder" diagnostics.** Editor / `pyright`-in-worktree warnings go stale for an entire session and throw false positives (especially across multiple worktrees). Confirm with `ruff` / `pyright` / `pytest` from the terminal — or trust the worktree's own venv — never an IDE squiggle.
|
|
78
|
+
- **Verify third-party runtime behavior empirically before wiring it in.** Don't assume how an external library, API, or browser actually behaves — exercise it once and observe, then build on the observed contract.
|
|
79
|
+
- **If a claim can't be verified in the current environment, it's LIKELY — not CONFIRMED.** Keep the issue open, reference it with `Refs #N` (not `Closes #N`), and ship diagnostics rather than a blind fix. When you can't reproduce it, hand the fix to whoever can.
|
|
80
|
+
|
|
72
81
|
## Skills reference (cross-tool)
|
|
73
82
|
|
|
74
83
|
The `skills/` directory ships installable agent skill docs in plain Markdown with YAML frontmatter. Any agent can consume them directly:
|
|
@@ -7,6 +7,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.23.0] — 2026-07-01
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **MCP generation is now functional (#228)**: the `gflow_generate_image` and
|
|
15
|
+
`gflow_generate_video` MCP tools — previously non-functional stubs — now enqueue onto
|
|
16
|
+
the FlowWorker queue and run end-to-end, with the background worker owning download and
|
|
17
|
+
history recording. The `tools` parameter (e.g. `creative-director`) is now applied to
|
|
18
|
+
expand the prompt before generation (it was previously accepted but never applied), and
|
|
19
|
+
reference images are supported across the image (`i2i`) and video (`i2v` / `r2v`) tools.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **macOS generation 401 — resolved (#222, #230)**: Flow cookies are now read from the
|
|
24
|
+
full cookie jar filtered by domain instead of a path-`/` URL filter that silently
|
|
25
|
+
dropped the `/fx`-scoped `__Secure-next-auth.session-token`; and on macOS — where the
|
|
26
|
+
headed generation context can intermittently fail to decrypt the on-disk cookie store —
|
|
27
|
+
the session is seeded into the context from a snapshot captured pre-launch via the
|
|
28
|
+
working `--password-store=basic` reader. Verified end-to-end on macOS (Apple Silicon) by
|
|
29
|
+
the reporter. Thanks @gunalak.
|
|
30
|
+
- **MCP video task safety (#228)**: `i2v` now requires `initial_frame` and `r2v` requires
|
|
31
|
+
`reference_images`, validated at the tool boundary with a clear error; a post-success
|
|
32
|
+
recording failure no longer flips a credit-spent video to `failed`; and any
|
|
33
|
+
non-`completed` task status is reported as a failure rather than a false success.
|
|
34
|
+
- **Chrome channel on Chromium-only hosts**: `channel_for_profile()` now gates
|
|
35
|
+
Playwright's `channel="chrome"` on a new `_is_playwright_chrome_channel_available()`
|
|
36
|
+
check that probes only the exact Google-Chrome paths Playwright hardcodes, instead
|
|
37
|
+
of `is_chrome_available()` (which also accepts Chromium). On a host with only
|
|
38
|
+
Chromium installed, the CLI no longer requests `channel="chrome"` and fails with
|
|
39
|
+
`Chromium distribution 'chrome' is not found at /opt/google/chrome/chrome`; it falls
|
|
40
|
+
back to bundled Chromium and logs an actionable warning (#219).
|
|
41
|
+
- **Text-to-image extra-image billing**: the generation-settings trigger selector now
|
|
42
|
+
requires `button[aria-haspopup='menu']` (aliased to `MODE_SWITCH_TRIGGER_SELECTORS`),
|
|
43
|
+
preventing a mis-click on an icon-only aspect thumbnail that skipped the count panel
|
|
44
|
+
and left Flow's own default count (typically 2) in effect — billing extra generations
|
|
45
|
+
while the CLI saved only one (#219).
|
|
46
|
+
- **Extra-image observability**: `generate_image()` now logs a
|
|
47
|
+
`client.generate_image_extra_returned` warning when the transport returns more images
|
|
48
|
+
than the requested `count=1`, so silent over-generation is surfaced to the user (#219).
|
|
49
|
+
- **macOS generation 401 — fail loud (#222)**: a `chrome`-strategy profile that is
|
|
50
|
+
silently downgraded to bundled Chromium at generation launch now raises instead of
|
|
51
|
+
running logged-out, so the macOS auth failure surfaces at its cause rather than as an
|
|
52
|
+
opaque later `401`.
|
|
53
|
+
|
|
54
|
+
### Diagnostics
|
|
55
|
+
|
|
56
|
+
- **Persistent-context cookie state (#222)**: generation launch now logs the resolved
|
|
57
|
+
`cookies_db_path` (`client.persistent_context_launch`) and the launched context's own
|
|
58
|
+
cookie state (`client.context_cookie_state`: `flow_session_cookie_present` / count /
|
|
59
|
+
expiry — **never values**, safe to paste publicly). This splits a cookie-**load**
|
|
60
|
+
failure (the macOS persistent context cannot decrypt the profile's cookies) from a
|
|
61
|
+
server-side rejection — the observability that localized the macOS `401` root cause,
|
|
62
|
+
now resolved (see the #222/#230 entry above).
|
|
63
|
+
|
|
10
64
|
## [0.22.0] — 2026-06-28
|
|
11
65
|
|
|
12
66
|
### Added
|
|
@@ -1628,7 +1682,8 @@ shell-script template that branches on these codes.
|
|
|
1628
1682
|
|
|
1629
1683
|
First skeleton. Not functional end-to-end yet.
|
|
1630
1684
|
|
|
1631
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1685
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.23.0...HEAD
|
|
1686
|
+
[0.23.0]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...v0.23.0
|
|
1632
1687
|
[0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
|
|
1633
1688
|
[0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
|
|
1634
1689
|
[0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
## Active phase
|
|
27
27
|
|
|
28
|
-
- **Decoupled Daemon/Worker Plan:** The
|
|
28
|
+
- **Decoupled Daemon/Worker Plan:** The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). The remaining headless SSE Daemon + Tauri/React editor blueprint is scheduled in [gflow-studio-scaffold/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md) and [rest-api-layer/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md).
|
|
29
29
|
- **Core Lesson (Retrospective):** Kept `gflow-cli` strictly headless (running Uvicorn and FastMCP over localhost HTTP/SSE). Bypassed browser context locks by serializing task writes in SQLite queue, allowing parallel client database reads via WAL mode.
|
|
30
30
|
|
|
31
31
|
See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
|
|
@@ -14,6 +14,28 @@ Living list of behaviour that's broken, surprising, or limited by design — alo
|
|
|
14
14
|
|
|
15
15
|
## Open
|
|
16
16
|
|
|
17
|
+
### macOS: generation runs logged-out → HTTP 401, even with `--browser chrome`
|
|
18
|
+
|
|
19
|
+
- **Status:** **RESOLVED in v0.23.0** ([#222](https://github.com/ffroliva/gflow-cli/issues/222),
|
|
20
|
+
fixed by [#230](https://github.com/ffroliva/gflow-cli/pull/230), @gunalak)
|
|
21
|
+
- **Severity:** High · **Affected:** all `gflow` generation on **macOS** with a
|
|
22
|
+
`chrome`-strategy profile; Windows was unaffected
|
|
23
|
+
|
|
24
|
+
On macOS, generation calls failed with **HTTP 401** (`AuthExpiredError` at
|
|
25
|
+
`project.createProject`) on a profile that `gflow auth login` and verification
|
|
26
|
+
accepted. Two corrections fixed it (verified end-to-end on macOS Apple Silicon):
|
|
27
|
+
|
|
28
|
+
1. **Cookie-read bug (unconditional).** The Flow cookie snapshot read the jar via
|
|
29
|
+
`ctx.cookies(["https://labs.google"])`, whose path-`/` filter silently dropped
|
|
30
|
+
the `/fx`-scoped `__Secure-next-auth.session-token`. Now the full jar is read
|
|
31
|
+
and filtered by domain, so the session token is captured.
|
|
32
|
+
2. **macOS headed-context decrypt (intermittent).** When the headed generation
|
|
33
|
+
context can't decrypt the on-disk store, the session is seeded from a snapshot
|
|
34
|
+
captured **pre-launch** via the working `--password-store=basic` reader. No-op on
|
|
35
|
+
Windows and on runs where the context decrypts natively.
|
|
36
|
+
|
|
37
|
+
Evidence: [LIVE_VERIFICATION_v0.23.0](docs/LIVE_VERIFICATION_v0.23.0.md).
|
|
38
|
+
|
|
17
39
|
### Flow's new full-page media-library UI breaks entity attach (A/B rollout)
|
|
18
40
|
|
|
19
41
|
- **Status:** **Open** — Flow-side staged rollout; tracked in
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gflow-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.23.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.15.
|
|
61
|
+
Requires-Dist: ruff==0.15.20; 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'
|
|
@@ -366,7 +366,7 @@ The video-generation feature has its own sub-phase plan (spike → Phase A → P
|
|
|
366
366
|
- **`expand_prompt` reconcile — DONE 2026-06-28 (PR #215).** The legacy `mcp/prompts.py` `expand_prompt` MCP prompt is **deprecated** in favor of the `creative-director` tool (client-visible `[DEPRECATED]` marker; kept functional; removal slated for a future major). See [PROMPT_EXPANSION § Relationship to expand_prompt](file:///C:/development/github/gflow-cli/docs/PROMPT_EXPANSION.md).
|
|
367
367
|
- **My Tools — DONE 2026-06-28 (PR #216).** User-authored TOMLs in `<GFLOW_CLI_HOME>/tools/*.toml` are loaded into the registry (override-a-builtin-with-warning; malformed fails loud).
|
|
368
368
|
- **Backlog — deferred by design:** the S3 `Tool.apply(ctx)→outcome` dispatch framework. The research doc gates it on a *second, non-prompt* tool (e.g. Mockup) — building it now with a single prompt-only implementer is the documented "premature uniformity (guessed contract)" anti-pattern.
|
|
369
|
-
- [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog)
|
|
369
|
+
- [ ] **Integrated Filmmaking Studio, Flow Worker & MCP SSE Service.** (Backlog) The MCP→FlowWorker wiring shipped in v0.23.0 (PR #228). Remaining: a local FastAPI/React filmmaking studio dashboard + HTTP/SSE MCP. Planned in [gflow-studio-scaffold/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md) and [rest-api-layer/PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md).
|
|
370
370
|
- [x] **Issue #92: Google account identity persistence shipped 2026-05-28 (PR #110).** After every `gflow auth login`, both auth strategies write the verified email to `$GFLOW_CLI_HOME/profile_<name>/.gflow_account`. `ProfileMeta.google_account` surfaces it; `gflow auth list` and `gflow auth list --json` display it. First-login auto-rename: when no `--profile` flag was given and the only profile is named `default`, it is renamed to the email local-part. `profile_store.rename_profile()` primitive added. Zero-credit smoke test (`tests/smoke/test_profile_account_smoke.py`) ships with backfill path for pre-existing profiles. LLM council (9-dim) run; all must-fix items applied before merge. See `KNOWN_ISSUES.md` § Resolved for full detail.
|
|
371
371
|
- [x] **`/gflow:pr-council-review` slash command shipped 2026-05-26 (PR #97).** Multi-dimensional LLM council for open PRs (4 baseline + 8 adaptive dimensions, mandatory memory-slug binding, draft-PR guard, YELLOW escape valve, live-verify gate). Validated on PR #93; self-audited by 3-agent meta-council surfacing 13 must-fix items applied before merge. See memory `[[llm-council-code-review-pr93]]`.
|
|
372
372
|
- **Phase A (Backlog — Portability):** extract command body into `skills/pr-council-review/SKILL.md` so Gemini CLI / Codex / Cursor / Aider can consume it. Keep `.claude/commands/gflow/pr-council-review.md` as a thin wrapper. Memory: `[[pr-council-review-portability-backlog]]`.
|
|
@@ -37,7 +37,6 @@ Welcome to the `gflow-cli` documentation. This index is the routing layer: it te
|
|
|
37
37
|
| **[docs/TOOLS.md](TOOLS.md)** | Tools framework: the `gflow tools list/show/run` group, the `--tool/-t` option on generation commands, the TOML tool schema, how a tool is defined, "My Tools" user-authored tools, MCP exposure + §61 parity | Working on `gflow_cli.tools`, adding a built-in or user tool, or wiring `--tool` into a command |
|
|
38
38
|
| **[docs/MCP.md](MCP.md)** | MCP server: `gflow mcp run` (stdio) + `gflow serve` (HTTP/SSE), the tools/prompts/resources surface, CLI↔MCP §61 parity, security model, client setup | Configuring an MCP client, working on `gflow_cli.mcp`, or debugging the stdio/SSE transports |
|
|
39
39
|
| **[docs/PROMPT_EXPANSION.md](PROMPT_EXPANSION.md)** | The `creative-director` tool: 5-component formula, 15 domain styles, banned-keyword policy, Gemini endpoint + I/O, never-fatal contract, `expanded_prompt` + `metadata_json.tool` provenance/redaction, config | Using or debugging `--tool creative-director`, editing the tool TOML, or auditing recorded prompt provenance |
|
|
40
|
-
| **[docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md](superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md)** | Integrated local Filmmaking Studio Web UI, Flow Worker queue daemon, and MCP SSE server design spec (HLD/LLD) | Understanding the integrated HTTP/SSE daemon architecture |
|
|
41
40
|
| **[docs/IMAGE_UPSCALE_RECON.md](IMAGE_UPSCALE_RECON.md)** | `gflow image upscale` wire protocol: `upsampleImage` endpoint, full clientContext (projectId/sessionId/tool/userPaygateTier), reCAPTCHA action `IMAGE_GENERATION`, inline base64 response, 4K Ultra-gating, REST-is-dead proof | Working on `gflow image upscale`, debugging the 403/reCAPTCHA path, or understanding Flow's image-upscale wire protocol (#171) |
|
|
42
41
|
| **[docs/AGENT_UI_RECON.md](AGENT_UI_RECON.md)** | Agentic Flow UI cohort: classic-vs-agentic DOM signature, server-side + volatile (flapping) A/B gating (no client-readable flag), why `_exit_agent_mode` fails, runtime-DOM-detection recommendation | Touching `_exit_agent_mode` / composer mode-switch, diagnosing exit 23 selector drift, or understanding Flow's agentic-UI A/B (#183/#174) |
|
|
43
42
|
| **[tasks/lessons.md](../tasks/lessons.md)** | Running notebook of patterns + reviewer findings, dated and traced to commits | Starting a new phase; debugging "why did the council flag this?" |
|
|
@@ -118,7 +117,7 @@ Slash commands for Claude Code, stored in `.claude/commands/gflow/`. All prefixe
|
|
|
118
117
|
**"A gflow command hangs / fails — where do I start?"** → [DEBUGGING § Quick reference](DEBUGGING.md#quick-reference)
|
|
119
118
|
**"Flow's UI broke a selector — how do I diagnose it?"** → [DEBUGGING § Inspecting Flow's live UI](DEBUGGING.md#inspecting-flows-live-ui)
|
|
120
119
|
**"What does each `ui_automation.*` log event mean?"** → [DEBUGGING § Listener & HTTP-layer debugging](DEBUGGING.md#listener--http-layer-debugging)
|
|
121
|
-
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc)
|
|
120
|
+
**"What was actually live-verified for the latest release?"** → latest: [LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP generation wiring proven live end-to-end — tool→worker→real Flow REST→structured-error translation; final image-write blocked by an expired session, environmental. #222 macOS fix reporter-verified e2e on Apple Silicon). Prior: [v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (Tools framework — automated/CI coverage complete; credit/key-gated live feature run is a pending owner gate, see the doc) · [v0.21.0](LIVE_VERIFICATION_v0.21.0.md) (MCP server over stdio + HTTP/SSE — credit-free protocol handshake; 4 tools / 2 prompts / 3 resources confirmed on stdout) · [v0.20.1](LIVE_VERIFICATION_v0.20.1.md) · [v0.20.0](LIVE_VERIFICATION_v0.20.0.md) · [v0.19.0](LIVE_VERIFICATION_v0.19.0.md) · [v0.18.0](LIVE_VERIFICATION_v0.18.0.md) · [v0.17.0](LIVE_VERIFICATION_v0.17.0.md) · [v0.16.0](LIVE_VERIFICATION_v0.16.0.md) · [v0.13.0](LIVE_VERIFICATION_v0.13.0.md) · [v0.12.0](LIVE_VERIFICATION_v0.12.0.md) · [v0.11.0](LIVE_VERIFICATION_v0.11.0.md) · [v0.10.0](LIVE_VERIFICATION_v0.10.0.md) · [v0.9.1](LIVE_VERIFICATION_v0.9.1.md) · [v0.9.0](LIVE_VERIFICATION_v0.9.0.md) · [v0.8.1](LIVE_VERIFICATION_v0.8.1.md) · [v0.7.0](LIVE_VERIFICATION_v0.7.0.md)
|
|
122
121
|
**"Where is the reverse-engineered wire protocol for a feature?"** → the `*_RECON.md` design docs: [CHARACTER_RECON](CHARACTER_RECON.md) (Flow character entity protocol), [IMAGE_UPSCALE_RECON](IMAGE_UPSCALE_RECON.md) (`/v1/flow/upsampleImage` wire). Naming convention: one `<FEATURE>_RECON.md` per reverse-engineered surface, kept as the durable spec after the feature ships.
|
|
123
122
|
**"What was live-verified for the data layer (PR #58)?"** → [LIVE_VERIFICATION_data_layer](LIVE_VERIFICATION_data_layer.md) — 1 Imagen + 1 Veo credit on denon82, 6-layer ledger (file + magic + Pillow + DB rows + CLI round-trip + structlog)
|
|
124
123
|
**"What was live-verified for the video-download feature (#29)?"** → [LIVE_VERIFICATION_video_download](LIVE_VERIFICATION_video_download.md)
|
|
@@ -82,5 +82,39 @@ Owner checklist (run after publish, then fill **Post-tag evidence**):
|
|
|
82
82
|
|
|
83
83
|
## Post-tag evidence
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
### Tool / expander / My-Tools — ✅ live-verified 2026-06-28 (real Gemini API)
|
|
86
|
+
|
|
87
|
+
Run with the owner's `GFLOW_CLI_GEMINI_API_KEY` (from `.env.local`), CLI v0.22.0:
|
|
88
|
+
|
|
89
|
+
| # | Check | Command | Result |
|
|
90
|
+
|---|---|---|---|
|
|
91
|
+
| 1 | Tool registered | `gflow tools list` | `creative-director` listed (Title/Category/Description correct) ✅ |
|
|
92
|
+
| 2 | Real expansion | `gflow tools run creative-director "a cat on a couch" --style cinema --json` | `was_expanded: true`; 16→1189 chars; vivid 5-component prose naming a real camera (Sony A7R IV / Cooke S7/i) + prestige anchor (Kinfolk); structlog `prompt_expanded` (model `gemini-2.5-flash`) ✅ |
|
|
93
|
+
| 3 | Banned-keyword guarantee | `gflow tools run creative-director "a luxury watch" --style product` | output scanned against all 13 banned terms → **none present** ✅ |
|
|
94
|
+
| 4 | Never-fatal (bad key) | `GFLOW_CLI_GEMINI_API_KEY=invalid-key-xyz gflow tools run creative-director "a dog" --json` | `was_expanded: false`, original returned, no error/exit ✅ |
|
|
95
|
+
| 5 | Video category style | `gflow tools run creative-director "a city at night" --style cinematic` | rewrites with cinematic vocabulary (video-gated style resolves) ✅ |
|
|
96
|
+
| 6 | "My Tools" loader | wrote `<HOME>/tools/haiku-bot.toml`; `GFLOW_CLI_HOME=<tmp> gflow tools list` | user tool `haiku-bot` listed **alongside** the builtin `creative-director` ✅ |
|
|
97
|
+
|
|
98
|
+
These exercise the whole prompt-tool path (registry → `apply_tool` → `build_instruction` → live
|
|
99
|
+
`PromptExpander.expand` → `strip_banned_keywords`), the never-fatal contract, category gating, and
|
|
100
|
+
the user-dir loader — end to end against the real Gemini endpoint.
|
|
101
|
+
|
|
102
|
+
### Generation recording (`expanded_prompt` + `metadata_json.tool` + redaction) — ✅ live-verified 2026-06-28
|
|
103
|
+
|
|
104
|
+
Real credit-free `image t2i` generations on the authenticated `denon82` profile (agentic UI
|
|
105
|
+
cohort, model NARWHAL), CLI v0.22.0:
|
|
106
|
+
|
|
107
|
+
**Store mode** — `gflow image t2i "a fox in the snow" --tool creative-director:style=cinema --profile denon82`:
|
|
108
|
+
- File: a real **729 KB JPEG** (magic bytes `ff d8 ff`) written to the `--out` dir ✅
|
|
109
|
+
- `prompt` = `"a fox in the snow"` (the **original**) ✅
|
|
110
|
+
- `expanded_prompt` = the 971-char rewrite (`"A sleek, mature red fox, …"`) ✅
|
|
111
|
+
- `operations.metadata_json.tool` = `{name: "creative-director", version: "1", model: "gemini-2.5-flash", params: {style: "cinema"}, config_hash: "e8399085…"}` ✅
|
|
112
|
+
|
|
113
|
+
**Redacted mode** — same command with `GFLOW_CLI_HISTORY_PROMPTS=redacted` (`"a red barn at dusk"`):
|
|
114
|
+
- `prompt` = `None`, `prompt_redacted` = `1`, `expanded_prompt` = `None` (both withheld) ✅
|
|
115
|
+
- `metadata_json.tool` = `{name, version, params_hash, config_hash}` only — no `model`, no raw
|
|
116
|
+
`params` (replaced by `params_hash`) ✅
|
|
117
|
+
- `config_hash` identical to store mode (same resolved `ToolConfig`) — tamper-evidence confirmed ✅
|
|
118
|
+
|
|
119
|
+
**All 5 ledger layers cleared** (file + magic bytes + real generation + DB rows in both prompt
|
|
120
|
+
modes + structlog `prompt_expanded`/`ui_driver.bound`). v0.22.0 live verification is **complete**.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Live Verification — v0.23.0
|
|
2
|
+
|
|
3
|
+
Release date: 2026-07-01. This document records what was exercised against **live
|
|
4
|
+
Google Flow** (credit-free wherever possible) for the user-facing changes in v0.23.0,
|
|
5
|
+
following the 5-layer verification ledger.
|
|
6
|
+
|
|
7
|
+
## Scope
|
|
8
|
+
|
|
9
|
+
| Change | Surface | Live-verified? |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| **#228** — MCP generation now functional (tool → FlowWorker → download → record; `tools` applied) | MCP `gflow_generate_image` / `gflow_generate_video` | 🟡 Wiring proven live (tool → worker → real Flow REST + structured-error translation); the final image-write layer was **not** run live (expired session — environmental) — see below |
|
|
12
|
+
| **#230 / #222** — macOS generation 401 fixed (path=/ cookie read + headed-context seed) | `auth/cookies.py`, `api/client.py` (macOS headed Chrome) | ✅ Reporter-verified end-to-end on macOS (Apple Silicon) |
|
|
13
|
+
| **#219** — Chromium-only-host chrome-channel gate + T2I extra-image guard | `browser_manager.py`, image path | ⚠️ Not reproducible on this maintainer box (Google Chrome is installed) — covered by automated tests |
|
|
14
|
+
|
|
15
|
+
## #228 — MCP generation path (credit-free image)
|
|
16
|
+
|
|
17
|
+
Exercised the **wired MCP tool path in-process** (`gflow_generate_image`, profile
|
|
18
|
+
`denon82`, aspect 1:1, count 1) — the exact path this release fixes (tool → queue →
|
|
19
|
+
`FlowWorker.process_task` → real `FlowApiClient` → real Flow REST).
|
|
20
|
+
|
|
21
|
+
**Proven live (structlog evidence, 2026-07-01):**
|
|
22
|
+
- `mcp.tool.profile_resolved requested=denon82 resolved=denon82` — profile resolution
|
|
23
|
+
- `mcp.tool.task_enqueued task_type=t2i` → `Processing task` — enqueue + worker dispatch
|
|
24
|
+
- `client.persistent_context_launch channel=chrome chrome_strategy_requested=True cookies_db_present=True password_store_basic=True` — real headed Chrome, chrome-strategy
|
|
25
|
+
- `client.context_cookie_state context_cookie_count=57 flow_session_cookie_present=True google_sapisid_present=True` — cookies loaded
|
|
26
|
+
- Reached a **real Flow REST call**: `POST project.createProject`
|
|
27
|
+
- **Structured-error translation confirmed** (the core #228 wiring): the server returned
|
|
28
|
+
HTTP 401 → worker raised `AuthExpiredError` → the MCP tool returned a clean RFC-9457
|
|
29
|
+
failure envelope:
|
|
30
|
+
```json
|
|
31
|
+
{"status":"failed","error":{"type":".../auth-expired","title":"Authentication expired",
|
|
32
|
+
"status":401,"detail":"HTTP 401","remediation_hint":"Run `gflow auth login ...`",
|
|
33
|
+
"exit_code":3}}
|
|
34
|
+
```
|
|
35
|
+
This exercises exactly the tool→worker→status-translation path the release wires, plus
|
|
36
|
+
the "any non-`completed` status → failure" behavior added in this release.
|
|
37
|
+
|
|
38
|
+
**Not completed live (environmental, not a code defect):** the actual image creation +
|
|
39
|
+
download + `local_files` recording did not run because the `denon82` Flow session was
|
|
40
|
+
**server-side expired** (HTTP 401 on a fully-loaded cookie jar — a stale session token,
|
|
41
|
+
distinct from the #222 macOS decrypt bug). Completing the image-write layer requires an
|
|
42
|
+
interactive `gflow auth login --profile denon82` (browser login). The generation +
|
|
43
|
+
download + recording code beneath the MCP wiring is the **same shared FlowWorker /
|
|
44
|
+
FlowApiClient path** exercised live in prior releases (CLI image path) and by the
|
|
45
|
+
automated suite.
|
|
46
|
+
|
|
47
|
+
## #230 / #222 — macOS generation 401
|
|
48
|
+
|
|
49
|
+
Verified **end-to-end on macOS (Apple Silicon) by the issue reporter** (@gunalak), both
|
|
50
|
+
branches of the fix (PR #230 body evidence):
|
|
51
|
+
- **Seed fires** (headed decrypt loaded nothing): `context_cookie_count=0
|
|
52
|
+
flow_session_cookie_present=False` → `preread_count=8 preread_session=True` →
|
|
53
|
+
`context_cookies_seeded seeded_session=True` → `createProject` + `batchGenerateImages`
|
|
54
|
+
**200** → image written.
|
|
55
|
+
- **Native decrypt** (seed is a no-op): `context_cookie_count=7
|
|
56
|
+
flow_session_cookie_present=True` → **200** → image written.
|
|
57
|
+
|
|
58
|
+
Council review (`/gflow:pr-council-review` #230): correctness/security/auth/quality all
|
|
59
|
+
GREEN; tests/memory YELLOW (coverage-gap follow-up tracked).
|
|
60
|
+
|
|
61
|
+
## Automated coverage
|
|
62
|
+
|
|
63
|
+
- Full suite (this release tree): **1918 passed / 7 skipped** (pre-#230), plus **70
|
|
64
|
+
passed** on the #230-affected suites (`tests/api/test_client_launch_kwargs.py`,
|
|
65
|
+
`tests/auth/`) after the merge.
|
|
66
|
+
- `pyright src`: 0 errors. `ruff check` / `ruff format --check`: clean.
|
|
67
|
+
- New MCP-wiring regression tests (`tests/mcp/test_tools_wired.py`,
|
|
68
|
+
`tests/worker/test_daemon.py`) assert the full enqueue → worker → status-translation
|
|
69
|
+
path and the `tool_specs` application.
|
|
70
|
+
|
|
71
|
+
## Follow-ups
|
|
72
|
+
|
|
73
|
+
- MCP → worker → download/record has no gated live e2e harness yet (tracked): a
|
|
74
|
+
`test_mcp_*_e2e.py` mirroring `test_daemon_e2e.py` (opt-in, credit-free image).
|
|
75
|
+
- Two #230 regression tests (falsifiable `/fx` cookie-path test + `_preread` capture
|
|
76
|
+
test) tracked as a post-merge follow-up.
|
|
@@ -45,10 +45,10 @@ Both Click CLI (`src/gflow_cli/cli.py`) and MCP Server (`src/gflow_cli/mcp/`) ar
|
|
|
45
45
|
The server registers three protocol surfaces:
|
|
46
46
|
|
|
47
47
|
### Tools (Executable actions)
|
|
48
|
-
* `gflow_generate_image(prompt, model, aspect, count, seed)`: Triggers text-to-image (Imagen
|
|
49
|
-
* `gflow_generate_video(prompt,
|
|
50
|
-
* `gflow_list_projects(
|
|
51
|
-
* `gflow_list_characters(
|
|
48
|
+
* `gflow_generate_image(prompt, model, aspect, count, seed, reference_images, tools, profile)`: Triggers text-to-image / image-to-image (Imagen / Nano Banana). `reference_images` switches to i2i.
|
|
49
|
+
* `gflow_generate_video(prompt, mode, aspect, initial_frame, end_frame, reference_images, tools, profile)`: Triggers vertical or landscape video generation (Veo). `mode` is `t2v`/`i2v`/`r2v`; `i2v` requires `initial_frame`, `r2v` requires `reference_images`.
|
|
50
|
+
* `gflow_list_projects(profile, limit)`: Queries SQLite catalog for recent generation folders.
|
|
51
|
+
* `gflow_list_characters(profile)`: Lists Flow Character entities (requires an active browser session).
|
|
52
52
|
|
|
53
53
|
### Prompts (Orchestration templates)
|
|
54
54
|
* `expand_prompt`: Helps the agent structure simple ideas into Google's official 5-component prompt formula (Subject + Action + Location + Composition + Style) before sending them to the generation tools.
|
|
@@ -4,9 +4,25 @@
|
|
|
4
4
|
|
|
5
5
|
## Current release
|
|
6
6
|
|
|
7
|
+
**v0.23.0 — alpha.** **MCP generation goes live + macOS 401 fixed.** The MCP server's
|
|
8
|
+
`gflow_generate_image` / `gflow_generate_video` tools — previously non-functional stubs —
|
|
9
|
+
are now wired end-to-end to the FlowWorker queue (background worker owns download +
|
|
10
|
+
history recording), the `tools` prompt-expansion parameter is actually applied, and i2v/r2v
|
|
11
|
+
require their frame/reference inputs at the tool boundary. The long-standing macOS
|
|
12
|
+
generation `401` (#222) is resolved (#230, @gunalak): Flow cookies are read from the full
|
|
13
|
+
jar by domain instead of a path-`/` filter that dropped the `/fx`-scoped session token, and
|
|
14
|
+
the headed context is seeded from a pre-launch snapshot when macOS can't decrypt the store.
|
|
15
|
+
Carries forward v0.22.0 (Tools framework) + v0.21.0 (MCP server). Verification:
|
|
16
|
+
[LIVE_VERIFICATION_v0.23.0](LIVE_VERIFICATION_v0.23.0.md) (MCP wiring proven live; #222
|
|
17
|
+
reporter-verified e2e on macOS).
|
|
18
|
+
|
|
19
|
+
**Develop (unreleased, post-v0.23.0):** *(empty — develop is the staging branch for the next release).*
|
|
20
|
+
|
|
21
|
+
<details><summary>v0.22.0 — Tools framework ("Creative Director")</summary>
|
|
22
|
+
|
|
7
23
|
**v0.22.0 — alpha.** **Tools framework ("Creative Director").** A TOML-defined prompt-tool system: `creative-director` rewrites a terse prompt into a vivid one via Google's five-component formula (public Gemini API, never-fatal), with 15 category-gated domain styles and deterministic banned-keyword stripping. Invoke it via the new `gflow tools list/show/run` group or the uniform `-t`/`--tool` option on every generation command (`image t2i`/`i2i`/`batch`, `video t2v`/`i2v`/`r2v`/`chain`), replacing the never-released `-e/--expand`. History records the original prompt, the submitted `expanded_prompt`, and `metadata_json.tool` provenance (redaction-honoring). **"My Tools"**: user-authored TOMLs in `<GFLOW_CLI_HOME>/tools/*.toml` load automatically. MCP parity via `gflow_list_tools` + a `tools` array param; the legacy `expand_prompt` MCP prompt is deprecated. The Gemini expander gained an overall wall-clock budget. Carries forward v0.21.0 (MCP server over stdio + HTTP/SSE). Verification: [LIVE_VERIFICATION_v0.22.0](LIVE_VERIFICATION_v0.22.0.md) (CI/automated complete; live owner-run pending).
|
|
8
24
|
|
|
9
|
-
|
|
25
|
+
</details>
|
|
10
26
|
|
|
11
27
|
## Milestone history
|
|
12
28
|
|
|
@@ -68,6 +84,8 @@
|
|
|
68
84
|
| Aspect-ratio overrides under Agentic & Classic cohorts + `GFLOW_CLI_PREFER_CLASSIC` (#193) | ✅ done (v0.20.0 / v0.20.1) |
|
|
69
85
|
| MCP server (`gflow mcp run` stdio + `gflow serve` HTTP/SSE) + daemon/queue scaffolding | ✅ done (v0.21.0) |
|
|
70
86
|
| Tools framework: `gflow tools` group + `--tool` + `creative-director` + "My Tools" + MCP parity | ✅ done (v0.22.0) |
|
|
87
|
+
| MCP generation wired to FlowWorker (tool→queue→download→record) + `tools` applied + i2v/r2v boundary validation | ✅ done (v0.23.0) |
|
|
88
|
+
| macOS generation 401 fixed — `/fx` cookie-path read + headed-context seed (#222/#230) | ✅ done (v0.23.0) |
|
|
71
89
|
| `gflow video batch` (TSV manifest) on `ui_automation` | ⏳ Phase B |
|
|
72
90
|
| Persistence layer (stay-mounted batch sessions across project boundaries) | ⏳ Phase B |
|
|
73
91
|
| Provider abstraction for official Veo 3.1 API | ⏳ planned |
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Issue-assessment workflow — design
|
|
2
|
+
|
|
3
|
+
> Status: **approved design** (2026-06-29). Next step: `writing-plans` → author skills with `writing-skills`.
|
|
4
|
+
> Scope: two new project skills that let an agent triage a GitHub issue, report to the reporter, and — when scope is clear — drive a guard-railed fix to a draft PR. Built to run both interactively and autonomously (hermes-ops on the VPS).
|
|
5
|
+
|
|
6
|
+
## Problem
|
|
7
|
+
|
|
8
|
+
Incoming GitHub issues (e.g. #222) need a **systematic, repeatable** assessment instead of ad-hoc investigation. We want a process that:
|
|
9
|
+
|
|
10
|
+
1. Reads the reporter's claim and verifies it against code, tests, docs, `KNOWN_ISSUES.md`, and auto-memory.
|
|
11
|
+
2. Produces a defensible verdict and a reply to the reporter.
|
|
12
|
+
3. **Requires e2e evidence before claiming a fix works** — and is honest when e2e is impossible in the current environment.
|
|
13
|
+
4. When scope is clear, performs the full development workflow in an isolated worktree and opens a PR **for human review** (never merges).
|
|
14
|
+
5. Can run **autonomously** (hermes-ops VPS) without taking wrong outward-facing actions.
|
|
15
|
+
6. Tells the agent **which project skill to use for what**, so it does not hallucinate skill names.
|
|
16
|
+
|
|
17
|
+
## Key environmental constraint
|
|
18
|
+
|
|
19
|
+
The hermes-ops VPS is **headless Linux**. Flow generation auth requires a **headed real-Chrome** session (`real-browser-auth-mandatory` in memory). Therefore, for any Flow-generation/selector/auth bug, the autonomous agent **cannot e2e-verify** — it can only get the problem review-ready and hand to a human. This is encoded as a **standing known limitation**, never hidden. The design goal is to make a wrong autonomous action *rare*, not to pretend the agent can verify everything.
|
|
20
|
+
|
|
21
|
+
## Two-layer architecture (orchestration vs domain)
|
|
22
|
+
|
|
23
|
+
Separation of concerns across two repos, with a one-way dependency:
|
|
24
|
+
|
|
25
|
+
- **hermes-ops = orchestration layer (project-agnostic "HOW the agent operates").** Triggers (cron/webhook/label), the autonomy gate, the `skills/`→`blessed/` blessing procedure, secret access (SOPS `GH_TOKEN`), the Opus→Sonnet→Opus delegation loop, Telegram delivery, idempotency. Hosts an `autopilot-core` reused by `dependabot-autopilot` (deterministic), `issue-autopilot` (LLM), and `release-autopilot` (weekly patch-bump-if-safe).
|
|
26
|
+
- **gflow-cli = domain layer (project-specific "WHAT the work means").** `issue-assessment` / `issue-resolve` + the existing `/gflow:*` pipeline. Encodes gflow-cli's e2e-gate (headed-browser truth), `KNOWN_ISSUES`, branch workflow.
|
|
27
|
+
|
|
28
|
+
**Rule:** hermes orchestration *calls into* a target repo's domain skills; gflow-cli never imports hermes. A gflow-cli skill must run standalone (interactive) **and** be invokable by hermes. The safety boundary lands on the blessing gate — the autonomous machinery (hermes layer) is exactly what a human blesses; domain skills are ordinary repo content. The two skills below are the **domain layer**; the orchestration layer is a later phase in the hermes-ops repo.
|
|
29
|
+
|
|
30
|
+
## Architecture — two skills (domain layer)
|
|
31
|
+
|
|
32
|
+
The repo already ships the fix pipeline as skills (`/gflow:predict` → `/gflow:scenario` → `/gflow:plan` → `/gflow:check` → `/gflow:pr-council-review`) plus superpowers TDD/worktrees. The new work is a **conductor** on top, split for a clean safety boundary:
|
|
33
|
+
|
|
34
|
+
- **`issue-assessment`** — READ-ONLY. Always safe to run, VPS-friendly. Ingest → verify → classify → e2e-gate → report. Decides (graded, not a hard stop) whether to chain into `issue-resolve`.
|
|
35
|
+
- **`issue-resolve`** — MUTATING, gated, autonomous-with-guardrails. Worktree off `develop` → predict/scenario/plan → TDD with Opus-orchestrated review loop → check → browser-free verification → **draft** PR → council review → STOP.
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
GitHub issue ─► issue-assessment (read-only)
|
|
39
|
+
1. Ingest gh issue view → claim, env, repro
|
|
40
|
+
2. Verify Explore agent over code/tests/docs + KNOWN_ISSUES.md + memory
|
|
41
|
+
3. Classify verdict taxonomy
|
|
42
|
+
4. e2e-gate is verification possible here & now?
|
|
43
|
+
5. Report comment to reporter (verdict + next step)
|
|
44
|
+
├─ INVALID / DUP / WONTFIX / NEEDS-INFO ─► stop (comment only)
|
|
45
|
+
└─ CONFIRMED/LIKELY-BUG & scope clear ──► issue-resolve (if autonomy gate allows)
|
|
46
|
+
|
|
47
|
+
issue-resolve (mutating, gated)
|
|
48
|
+
worktree off develop → /gflow:predict → /gflow:scenario → /gflow:plan
|
|
49
|
+
→ TDD (Opus plans, Sonnet codes, Opus reviews, loop to consensus)
|
|
50
|
+
→ /gflow:check → browser-free verification only
|
|
51
|
+
→ DRAFT PR → /gflow:pr-council-review → STOP
|
|
52
|
+
Human: promote draft → headed e2e → merge.
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## `issue-assessment` detail
|
|
56
|
+
|
|
57
|
+
### Verdict taxonomy (exactly one per assessment)
|
|
58
|
+
|
|
59
|
+
- `CONFIRMED-BUG` — reproduced or root-caused in code with line-level evidence.
|
|
60
|
+
- `LIKELY-BUG / NEEDS-E2E` — strong code hypothesis, unverifiable here (e.g. #222: macOS-only, no headed browser). **The common VPS outcome.**
|
|
61
|
+
- `NEEDS-INFO` — reporter must supply a discriminating diagnostic first.
|
|
62
|
+
- `DUPLICATE` / `KNOWN-ISSUE` — matches `KNOWN_ISSUES.md` or an open issue/PR.
|
|
63
|
+
- `WORKING-AS-INTENDED` / `INVALID` — usage error or expected behavior.
|
|
64
|
+
- `WONTFIX / OUT-OF-SCOPE` — real but deliberately not addressed.
|
|
65
|
+
|
|
66
|
+
### e2e-gate (the honesty mechanism)
|
|
67
|
+
|
|
68
|
+
Before claiming any verification, classify what verification *requires*:
|
|
69
|
+
|
|
70
|
+
- **Browser-free** (Gemini tool-path, unit, lint, pyright, recording-verif) → runnable autonomously; run it.
|
|
71
|
+
- **Headed-Flow-browser required** (generation, selector, auth) → NOT possible on VPS → mark `NEEDS-E2E`, never claim success, hand to human.
|
|
72
|
+
|
|
73
|
+
### Report format
|
|
74
|
+
|
|
75
|
+
A reporter-facing comment: restated claim, verdict + confidence, evidence (`file:line`), root-cause hypothesis, the discriminating diagnostic requested (if `NEEDS-INFO`/`NEEDS-E2E`), and the next step (draft PR link if `issue-resolve` ran, else what we need).
|
|
76
|
+
|
|
77
|
+
## `issue-resolve` guardrails
|
|
78
|
+
|
|
79
|
+
Autonomous allow-list:
|
|
80
|
+
- ✅ Post issue comment (text reply to reporter).
|
|
81
|
+
- ✅ Open a **draft** PR (push branch + open PR in draft state).
|
|
82
|
+
- ✅ Browser-free / credit-free verification.
|
|
83
|
+
- ❌ **Never** spend Veo credits (no credit-spending e2e).
|
|
84
|
+
- ❌ Never mark a PR ready; ❌ never merge; ❌ never push to `main`/`develop` (always a `bugfix/`-prefixed branch off `develop`).
|
|
85
|
+
|
|
86
|
+
Hard preconditions before opening even a draft PR:
|
|
87
|
+
1. Verdict ∈ {`CONFIRMED-BUG`, `LIKELY-BUG`} **and** scope single-surface / localized.
|
|
88
|
+
2. A failing test exists first (TDD) and passes after the fix.
|
|
89
|
+
3. `/gflow:check` clean (ruff + pyright + tests).
|
|
90
|
+
4. If verification needed a headed browser → PR body states **"NOT e2e-verified — requires human macOS/headed run"** explicitly.
|
|
91
|
+
|
|
92
|
+
Trigger gate (autonomy safety): the agent acts **only on issues a human labels** (e.g. `triage`), never on every new issue.
|
|
93
|
+
|
|
94
|
+
### Orchestration model
|
|
95
|
+
|
|
96
|
+
Opus plans → delegates coding to Sonnet → Opus reviews → loop until consensus → `/gflow:pr-council-review`. Gemini (`agy`) as an optional extra reviewer **if available** — soft dependency, never blocks.
|
|
97
|
+
|
|
98
|
+
## Anti-hallucination skill routing
|
|
99
|
+
|
|
100
|
+
The skill ships a **literal routing table** mapping situation → skill → how to invoke. Critical trap (in memory `skill-wrapper-registration-trap`): this repo's `skills/*/SKILL.md` are plain markdown invoked by **reading** `.claude/commands/gflow/*`, NOT by `Skill()`. Superpowers skills ARE `Skill()`-invocable. The skill instructs the agent to **re-derive** the table from `ls skills/` + `ls .claude/commands/gflow/` rather than trust a possibly-stale list.
|
|
101
|
+
|
|
102
|
+
| Situation | Use | How |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| High-stakes change (auth/transport/selector/schema) | `/gflow:predict` | Read `skills/predict/SKILL.md` |
|
|
105
|
+
| Edge cases + BDD skeleton | `/gflow:scenario` | Read `skills/scenario/SKILL.md` |
|
|
106
|
+
| Write task checklist | `/gflow:plan` | Read `skills/plan/SKILL.md` |
|
|
107
|
+
| Before any commit | `/gflow:check` | `.claude/commands/gflow/check.md` |
|
|
108
|
+
| Pre-PR / PR review | `/gflow:pr-council-review`, `branch-review` | Read `skills/pr-council-review/SKILL.md` |
|
|
109
|
+
| Touching auth/reCAPTCHA | `/gflow:known-issues` | `.claude/commands/gflow/known-issues.md` |
|
|
110
|
+
| Worktree, TDD, finishing a branch | superpowers | `Skill()` tool (these are invocable) |
|
|
111
|
+
|
|
112
|
+
## File layout
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
skills/issue-assessment/SKILL.md # read-only conductor
|
|
116
|
+
skills/issue-resolve/SKILL.md # mutating, gated
|
|
117
|
+
.claude/commands/gflow/issue-assessment.md # thin wrapper: "read skills/.../SKILL.md"
|
|
118
|
+
.claude/commands/gflow/issue-resolve.md
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Worked example — issue #222 (validation case)
|
|
122
|
+
|
|
123
|
+
macOS, v0.22.0: `image t2i` launches a logged-out browser → 401 on `createProject` despite `.gflow_browser_strategy=chrome`. Code investigation hypothesis: `channel_for_profile()` returns `None` because macOS `is_chrome_available()` (`src/gflow_cli/browser_manager.py:146`) only checks the hardcoded `/Applications/Google Chrome.app/...` path with no `shutil.which()` fallback (unlike Windows/Linux), so generation falls back to bundled Chromium, which can't decrypt Keychain-protected cookies. **Caveat:** if detection failed, a `browser_manager.chrome_marker_but_unavailable` warning should fire — the reporter didn't mention it, so the channel may instead never be resolved on the `setup_shared_page` path. This ambiguity is exactly why the verdict is `LIKELY-BUG / NEEDS-E2E` (macOS + headed browser, unverifiable on Windows or the VPS) rather than `CONFIRMED-BUG`. Expected workflow output: a reporter reply requesting the discriminating diagnostic (does the warning appear? actual Chrome path? DEBUG run with channel logging), plus optionally a draft PR adding the `shutil.which` fallback with a unit test, flagged NOT-e2e-verified.
|
|
124
|
+
|
|
125
|
+
## hermes-ops orchestration layer (later phase, hermes-ops repo)
|
|
126
|
+
|
|
127
|
+
Confirmed facts about the target runtime (`C:\development\github\hermes-ops`, deployed):
|
|
128
|
+
|
|
129
|
+
- **VPS:** `89.167.1.15` (`cgserver01`), headless Hetzner Linux. SSH `deploy@89.167.1.15` (key-based). hermes-agent v0.16.0 as a systemd unit (`HERMES_HOME=/opt/hermes`); repo at `/opt/hermes-ops` (git-pull deploy: `git fetch && git reset --hard origin/main`).
|
|
130
|
+
- **GitHub creds:** `GH_TOKEN` already provisioned in SOPS (`secrets/vps-prod.env.sops.yaml`), fine-grained PAT scoped to **gflow-cli `pull_requests:write + contents:write`**. Decrypted by `hermes.service` `ExecStartPre` to `/opt/hermes/.env` (600, owner `hermes`); `gh` reads it automatically.
|
|
131
|
+
- **Knowledge (T1):** git-versioned markdown in `hermes-ops/knowledge/`; update = branch → human review → merge → VPS pulls.
|
|
132
|
+
- **Triggers:** `hermes cron create "<expr>" "<prompt>" --skills … --deliver telegram` (v1); `hermes webhook subscribe --events … --skills … --deliver …` (v2, deferred).
|
|
133
|
+
- **Blessing gate (NOT yet implemented):** `skills/` (unprivileged staging) → human signoff → `blessed/` (executable). Skill file format + promotion procedure are undefined on disk — `autopilot-core` defines them once.
|
|
134
|
+
- **Headless confirmation:** no headed Chrome on the VPS → Flow-generation/selector/auth bugs are **never** e2e-verifiable autonomously. This is the standing known limitation that forces the `LIKELY-BUG / NEEDS-E2E` + draft-PR-for-human terminal behavior.
|
|
135
|
+
|
|
136
|
+
Reconciliation: the same-day `hermes-ops/docs/specs/2026-06-29-dependabot-autopilot-design.md` becomes the first (deterministic) specialization of `autopilot-core`. Nothing runs on the remote until the user confirms; this section is reference for the orchestration-layer spec to be written in the hermes-ops repo.
|
|
137
|
+
|
|
138
|
+
## Out of scope (this spec — domain layer only)
|
|
139
|
+
|
|
140
|
+
- The hermes-ops orchestration layer (`autopilot-core`, `issue-autopilot`, `release-autopilot`) — designed separately in the hermes-ops repo.
|
|
141
|
+
- Auto-merging or auto-promoting PRs (always draft, human promotes).
|
|
142
|
+
- Acting on unlabeled issues.
|
|
143
|
+
- Onboarding target repos other than gflow-cli.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "gflow-cli"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.23.0"
|
|
4
4
|
description = "Unofficial CLI for Google Flow — drive Veo image-to-video generations from the terminal."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = { file = "LICENSE" }
|
|
@@ -39,7 +39,7 @@ dependencies = [
|
|
|
39
39
|
dev = [
|
|
40
40
|
"pytest>=8.0.0",
|
|
41
41
|
"pytest-asyncio>=0.23.0",
|
|
42
|
-
"ruff==0.15.
|
|
42
|
+
"ruff==0.15.20",
|
|
43
43
|
"pyright>=1.1.0",
|
|
44
44
|
# video-chain: the last-frame extractor (media.py) decodes with PyAV, and its
|
|
45
45
|
# tests build synthetic mp4 fixtures with numpy. Declared here so the dev/CI
|
|
@@ -149,7 +149,7 @@ dev = [
|
|
|
149
149
|
"pytest-asyncio>=1.3.0",
|
|
150
150
|
"pytest-bdd>=8.1.0",
|
|
151
151
|
"pytest-cov>=7.1.0",
|
|
152
|
-
"ruff==0.15.
|
|
152
|
+
"ruff==0.15.20",
|
|
153
153
|
]
|
|
154
154
|
# Container-based integration tests — requires Docker daemon.
|
|
155
155
|
# Install: uv sync --group containers
|