gflow-cli 0.20.1__tar.gz → 0.22.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.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/pr-council-review.md +6 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/release.md +4 -2
- gflow_cli-0.22.0/.claude/commands/gflow/sonar.md +82 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.env.template +11 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/ci.yml +17 -3
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/governance-advisory.yml +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/governance-benchmark.yml +1 -1
- gflow_cli-0.22.0/.github/workflows/main-base-guard.yml +50 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/release.yml +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.gitignore +13 -6
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/AGENTS.md +3 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CHANGELOG.md +66 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CONFIGURATION.md +2 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CONTRIBUTING.md +17 -0
- gflow_cli-0.22.0/GEMINI.md +31 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/PKG-INFO +44 -40
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/PLAN.md +22 -1
- gflow_cli-0.22.0/README.md +144 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/ROADMAP.md +7 -6
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/CONFIGURATION.md +25 -2
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/INDEX.md +7 -1
- gflow_cli-0.22.0/docs/LIVE_VERIFICATION_v0.21.0.md +66 -0
- gflow_cli-0.22.0/docs/LIVE_VERIFICATION_v0.22.0.md +86 -0
- gflow_cli-0.22.0/docs/MCP.md +173 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/PROJECT_STATUS.md +7 -2
- gflow_cli-0.22.0/docs/PROMPT_EXPANSION.md +247 -0
- gflow_cli-0.22.0/docs/TOOLS.md +301 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/USAGE.md +65 -1
- gflow_cli-0.22.0/docs/assets/example-run.gif +0 -0
- gflow_cli-0.22.0/docs/assets/examples.webp +0 -0
- gflow_cli-0.22.0/docs/medium_tutorial.md +80 -0
- gflow_cli-0.22.0/docs/sonar-cleanup-tracker.md +81 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-mcp-server/PLAN.md +177 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-mcp-server/PREDICT.md +69 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-mcp-server/SCENARIO.md +67 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PLAN.md +146 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-prompt-expansion/PREDICT.md +56 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-22-prompt-expansion/SCENARIO.md +60 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/DESIGN.md +117 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md +110 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md +66 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/STUDIO_DESIGN.md +233 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-24-gflow-studio-scaffold/PLAN.md +94 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-24-rest-api-layer/PLAN.md +78 -0
- gflow_cli-0.22.0/docs/superpowers/plans/2026-06-26-mcp-e2e-test/PLAN.md +571 -0
- gflow_cli-0.22.0/docs/superpowers/research/2026-06-27-tool-abstraction-evaluation.md +141 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/pyproject.toml +8 -3
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/_cli_helpers.py +104 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/character.py +52 -49
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/client.py +88 -42
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/image.py +8 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/agentic.py +11 -6
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/classic.py +4 -4
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/factory.py +3 -1
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/ui_automation.py +87 -59
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/ui_automation_video.py +298 -212
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/video.py +33 -16
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/browser_manager.py +14 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/chain.py +96 -51
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/chain_manifest.py +38 -32
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli.py +134 -20
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_image.py +185 -86
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_movie.py +156 -100
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_scene.py +1 -1
- gflow_cli-0.22.0/src/gflow_cli/cli_tools.py +88 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_video.py +331 -152
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/composition.py +101 -62
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/config.py +32 -2
- gflow_cli-0.22.0/src/gflow_cli/data/migrations/0007_queue.sql +14 -0
- gflow_cli-0.22.0/src/gflow_cli/data/migrations/0008_add_operation_expanded_prompt.sql +6 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/models.py +3 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/recorder.py +226 -102
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/repository.py +5 -3
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/errors.py +8 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/image_batch.py +13 -1
- gflow_cli-0.22.0/src/gflow_cli/mcp/__init__.py +12 -0
- gflow_cli-0.22.0/src/gflow_cli/mcp/prompts.py +85 -0
- gflow_cli-0.22.0/src/gflow_cli/mcp/resources.py +94 -0
- gflow_cli-0.22.0/src/gflow_cli/mcp/server.py +160 -0
- gflow_cli-0.22.0/src/gflow_cli/mcp/tools.py +340 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/movie_manifest.py +226 -139
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/paths.py +5 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/banned.py +81 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/builtin/creative-director.toml +229 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/expander.py +303 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/invocation.py +87 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/loader.py +64 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/registry.py +52 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/runtime.py +63 -0
- gflow_cli-0.22.0/src/gflow_cli/tools/spec.py +78 -0
- gflow_cli-0.22.0/src/gflow_cli/ui/app.py +151 -0
- gflow_cli-0.22.0/src/gflow_cli/ui/server.py +16 -0
- gflow_cli-0.22.0/src/gflow_cli/worker/daemon.py +254 -0
- gflow_cli-0.22.0/src/gflow_cli/worker/queue.py +179 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image.py +51 -0
- gflow_cli-0.22.0/tests/cli/test_cli_tools.py +46 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_video.py +114 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_helpers.py +147 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_t2i_multi_prompt.py +47 -0
- gflow_cli-0.22.0/tests/data/test_recorder.py +488 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_store_migrations.py +10 -1
- gflow_cli-0.22.0/tests/e2e/test_daemon_e2e.py +143 -0
- gflow_cli-0.22.0/tests/e2e/test_tools_e2e.py +201 -0
- gflow_cli-0.22.0/tests/mcp/__init__.py +1 -0
- gflow_cli-0.22.0/tests/mcp/conftest.py +15 -0
- gflow_cli-0.22.0/tests/mcp/test_server.py +511 -0
- gflow_cli-0.22.0/tests/mcp/test_stdio_transport.py +106 -0
- gflow_cli-0.22.0/tests/services/__init__.py +0 -0
- gflow_cli-0.22.0/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_config.py +30 -0
- gflow_cli-0.22.0/tests/tools/__init__.py +0 -0
- gflow_cli-0.22.0/tests/tools/test_banned.py +58 -0
- gflow_cli-0.22.0/tests/tools/test_expander.py +295 -0
- gflow_cli-0.22.0/tests/tools/test_invocation.py +88 -0
- gflow_cli-0.22.0/tests/tools/test_loader.py +52 -0
- gflow_cli-0.22.0/tests/tools/test_registry.py +77 -0
- gflow_cli-0.22.0/tests/tools/test_runtime.py +64 -0
- gflow_cli-0.22.0/tests/tools/test_spec.py +97 -0
- gflow_cli-0.22.0/tests/ui/test_app.py +137 -0
- gflow_cli-0.22.0/tests/worker/test_daemon.py +284 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/uv.lock +463 -82
- gflow_cli-0.20.1/GEMINI.md +0 -28
- gflow_cli-0.20.1/README.md +0 -144
- gflow_cli-0.20.1/docs/assets/example-run.gif +0 -0
- gflow_cli-0.20.1/scripts/dev/record_flow_capture.py +0 -271
- gflow_cli-0.20.1/tests/data/test_recorder.py +0 -214
- gflow_cli-0.20.1/tests/dev/test_record_flow_capture.py +0 -88
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/active.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/branch-review.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/doc-review.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/next.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/predict.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/scenario.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.claude/commands/gflow/status.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.gitattributes +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/.secrets.baseline +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/CLAUDE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/KNOWN_ISSUES.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/LICENSE +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/RELEASE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docker-compose.yml +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AGENT_GUIDE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AGENT_UI_E2E.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AGENT_UI_RECON.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/CHARACTER.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/CHARACTER_RECON.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DATA_LAYER.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DEBUGGING.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DEMOS.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/E2E_TESTING.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/EXTERNAL_STORAGE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/GOVERNANCE_BENCHMARK.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/IMAGE_UPSCALE_RECON.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_data_layer.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_image_batch.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.10.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.11.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.12.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.13.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.16.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.17.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.18.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.19.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.20.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.20.1.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.8.1.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.9.0.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_v0.9.1.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/LIVE_VERIFICATION_video_download.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/MOVIE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/assets/demo-split-pf.gif +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/schemas/movie-handoff.schema.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/docs/superpowers/plans/2026-06-12-issue-174-library-ui-attach/PLAN.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/examples/workflow_chain.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/llms.txt +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/12_create_scene.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/13_sceneWorkflows_update.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/14_get_scene_workflows.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/samples/captured/15_commit_flowWorkflow.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/ci/check_doc_links.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/ci/check_materiality.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/_recording_client.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/_spike_common.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_frame_slots_dom.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_intercept_submit.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_model_select_repro.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_i2v_post_bind_state.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_image_add_media_dom.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/capture_locale_invariants.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/cdp_drive_and_probe.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/character_create_spike.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/character_create_spike_v2.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/dump_character_selectors.js +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/make_project.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/materiality_backtest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/monitor_pr_38.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/patch_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/skillopt/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/skillopt/harness.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/skillopt/tasks.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_char_editor_dom.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_char_gen_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_drive.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_recaptcha_action.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_image_upscale_rest_probe.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_issue170_picker_locale_recon.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_issue174_library_ui_recon.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_attach_payload.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_entity_recon.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_gen_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_picker_select.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_movie_voice_list.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_patch_entity.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/dev/spike_patchright.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/capture_flow_traffic.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/memory_profile.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/diag/recaptcha_mint.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/e2e/agentic_image_e2e.ps1 +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/e2e/capture_agent_toggle.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/README.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/plan/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/pr-council-review/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/predict/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/scenario/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/skills/status/SKILL.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/sonar-project.properties +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/_engine.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/_sapisidhash.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/dto.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/image_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/drivers/base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/bearer.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/cookies.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/internal_chromium.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/real_chrome.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/auth/verification.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_data.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/chain_repo.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0001_initial.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0002_add_cloud_storage.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0003_add_scene_tables.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0004_add_scene_output_path.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0005_add_chain_links.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/0006_add_operations_metadata.sql +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/migrations/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/queries.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/data/store.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/json_output.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/media.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/observability.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/services/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/services/character_create.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/src/gflow_cli/storage.py +0 -0
- {gflow_cli-0.20.1/tests → gflow_cli-0.22.0/src/gflow_cli/tools}/__init__.py +0 -0
- {gflow_cli-0.20.1/tests/api → gflow_cli-0.22.0/src/gflow_cli/tools/builtin}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/test_assets/sample_batch.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/test_assets/sample_batch.tsv +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/test_assets/sample_batch_invalid.tsv +0 -0
- {gflow_cli-0.20.1/tests/api/transports → gflow_cli-0.22.0/tests}/__init__.py +0 -0
- {gflow_cli-0.20.1/tests/api/transports/drivers → gflow_cli-0.22.0/tests/api}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/fixtures/character_gen_response.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/fixtures/patch_entity_response.json +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_aisandbox_auth_error.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_aisandbox_auth_headers.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_bearer_redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_delete_characters.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_generate_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_launch_kwargs.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_patch_entity.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_client_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_dto.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_engine.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_image_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_post_json_aisandbox_auth.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_routes_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_routes_scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_sapisidhash_helper.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_scene_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_video.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/test_video_request.py +0 -0
- {gflow_cli-0.20.1/tests/cli → gflow_cli-0.22.0/tests/api/transports}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/conftest.py +0 -0
- {gflow_cli-0.20.1/tests/data → gflow_cli-0.22.0/tests/api/transports/drivers}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/drivers/test_agentic.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/drivers/test_factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_transport_timeout.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_batch.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_image_mode.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_automation_video.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/api/transports/test_ui_character_editor.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/auth/strategies/test_strategies.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.20.1/tests/e2e → gflow_cli-0.22.0/tests/cli}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_auth_list.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_character_create.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_data.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image_seed_removed.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image_selector_drift.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_image_upscale.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_movie.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_scene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_cli_video_chain.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_movie_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/cli/test_settings_validation.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/composition/test_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/composition/test_compose_prompt.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/composition/test_handoff.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/conftest.py +0 -0
- {gflow_cli-0.20.1/tests/features → gflow_cli-0.22.0/tests/data}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_chain_repo.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_find_incomplete_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_models.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_packaging.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_recorder_character.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_repository.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_scene_persistence.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/data/test_settings_and_errors.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/dev/test_recording_client.py +0 -0
- {gflow_cli-0.20.1/tests/fixtures → gflow_cli-0.22.0/tests/e2e}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_aisandbox_auth_live.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_chain_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_character_create_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_data_layer_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_i2v_flags_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_image_batch_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_image_i2i_ref_cap_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_json_output_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_locale_selectors_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_scene_compose_live.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_video_r2v_ref_cap_e2e.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.20.1/tests/image_batch → gflow_cli-0.22.0/tests/features}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/character_create.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/character_read.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/image_upscale.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/locale_picker_include.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_character_create_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_character_read_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_image_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_image_upscale_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_locale_picker_include_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_video_agent_ui_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/test_video_chain_steps.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/video_agent_ui.feature +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/features/video_chain.feature +0 -0
- {gflow_cli-0.20.1/tests/integration → gflow_cli-0.22.0/tests/fixtures}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/fixtures/seeded_catalog.py +0 -0
- {gflow_cli-0.20.1/tests/services → gflow_cli-0.22.0/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/image_batch/test_image_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/image_batch/test_observability_events.py +0 -0
- {gflow_cli-0.20.1/tests/smoke → gflow_cli-0.22.0/tests/integration}/__init__.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/conftest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/constants.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/test_storage_gcs.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/integration/test_storage_s3.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_analyze_agent_ui_capture.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_capture_locale_invariants.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_check_materiality.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_check_repo_hygiene.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/scripts/test_materiality_backtest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/services/test_character_create_redaction.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/services/test_character_create_saga.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/services/test_character_gen_no_direct_post.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/smoke/test_profile_account_smoke.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_chain.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_chain_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_cli_data.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_conftest_isolation.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_data_queries.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_documentation_gate.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_errors.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_errors_403.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_json_output.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_marker_registry.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_media.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.20.1 → gflow_cli-0.22.0}/tests/test_smoke.py +0 -0
|
@@ -8,4 +8,10 @@ description: Multi-dimensional LLM council review of an open PR. Five baseline d
|
|
|
8
8
|
|
|
9
9
|
> Do **not** call `Skill(skill="pr-council-review")` — the repo's `skills/*/SKILL.md` files are plain Markdown, not registered as Skill-tool-invocable (only `.claude/commands/gflow/*` are). Invoking it errors with `Unknown skill: pr-council-review`. Read the file directly instead.
|
|
10
10
|
|
|
11
|
+
**Required gate — SonarCloud must be green.** The council reviews the *diff*; it does
|
|
12
|
+
not see SonarCloud's verdict. Before declaring the final verdict, run **`/gflow:sonar`**
|
|
13
|
+
for this PR — the `SonarCloud analysis` gate must be green (zero new issues). A red gate
|
|
14
|
+
is a blocking finding regardless of the council's own conclusions; report it with the
|
|
15
|
+
exact failing conditions and do not call the PR merge-ready until it is green.
|
|
16
|
+
|
|
11
17
|
Sibling: `/review` is the single-agent Claude-Code built-in (fast, one-pass). Use it for spot-checks; use this command for pre-merge multi-dim audits.
|
|
@@ -198,8 +198,10 @@ gh pr create --base main --head chore/release-v<NEW_VERSION> \
|
|
|
198
198
|
--title "chore(release): v<NEW_VERSION>"
|
|
199
199
|
```
|
|
200
200
|
|
|
201
|
-
Wait for PR CI to go green (`gh pr checks <N> --watch`)
|
|
202
|
-
|
|
201
|
+
Wait for PR CI to go green (`gh pr checks <N> --watch`). **The `SonarCloud analysis`
|
|
202
|
+
check must be green (gate passed) — not just the test matrix.** If it is red or you
|
|
203
|
+
want the verdict, run `/gflow:sonar <N>` and drive it to zero before merging. Then
|
|
204
|
+
merge with a **merge commit** — never squash:
|
|
203
205
|
|
|
204
206
|
```bash
|
|
205
207
|
gh pr merge <N> --merge --delete-branch
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Check the SonarCloud quality gate for a PR (or the current branch) and drive it to zero. Reports GREEN, or the exact PR-scoped new issues/hotspots/coverage gaps to fix.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:sonar [PR#]` — SonarCloud quality gate
|
|
6
|
+
|
|
7
|
+
The reusable Sonar primitive. `/gflow:check` is **local** and cannot see Sonar (it
|
|
8
|
+
is server-side, post-push); `/gflow:pr-council-review` is an LLM diff review, not the
|
|
9
|
+
gate verdict. This command answers one question: **is the SonarCloud gate green
|
|
10
|
+
(zero new issues) for this PR, and if not, exactly what must be fixed?**
|
|
11
|
+
|
|
12
|
+
`$ARGUMENTS` is the PR number. If empty, resolve it from the current branch
|
|
13
|
+
(`gh pr view --json number -q .number`).
|
|
14
|
+
|
|
15
|
+
Project: key `ffroliva_gflow-cli`, org `ffroliva-github` (see `sonar-project.properties`).
|
|
16
|
+
The CI scan sets `sonar.qualitygate.wait=true`, so a **green `SonarCloud analysis`
|
|
17
|
+
check means the gate genuinely passed** — but the gate **API is stale until that
|
|
18
|
+
check finishes**, so always check the GitHub check FIRST.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
**1. Check the GitHub check first (never trust the gate API while it's pending).**
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
gh pr checks <N> --json name,state,bucket | \
|
|
26
|
+
jq -r '.[] | select(.name=="SonarCloud analysis") | "\(.bucket) \(.state)"'
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- `pass` → **gate is GREEN / zero new issues. Done.** Report GREEN and stop.
|
|
30
|
+
- `pending` → the SonarCloud job (~50s) runs *after* the ~3.5min test matrix; wait
|
|
31
|
+
(`gh pr checks <N> --watch`) before reading the API, or the API returns the
|
|
32
|
+
previous commit's verdict.
|
|
33
|
+
- `fail` → continue to step 2 to enumerate the exact failing conditions.
|
|
34
|
+
|
|
35
|
+
**2. Enumerate the failing conditions (PR-scoped — this is the #1 gotcha).**
|
|
36
|
+
|
|
37
|
+
New-code issues live on the PR branch, NOT `main`. **Scope every call with
|
|
38
|
+
`&pullRequest=<N>`** or the API reports 0 and you chase phantoms. Token is in
|
|
39
|
+
`.env.local` as `SONAR_TOKEN` — read it inside a sandbox so it never lands in chat.
|
|
40
|
+
`curl` may be blocked by the context-mode hook → use `ctx_execute` (javascript
|
|
41
|
+
`fetch` with `Authorization: Basic base64(token+":")`).
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Which gate conditions are ERROR:
|
|
45
|
+
GET /api/qualitygates/project_status?projectKey=ffroliva_gflow-cli&pullRequest=<N>
|
|
46
|
+
# New issues (bugs/smells) with file:line + rule + creationDate:
|
|
47
|
+
GET /api/issues/search?componentKeys=ffroliva_gflow-cli&pullRequest=<N>&resolved=false
|
|
48
|
+
# Unreviewed security hotspots:
|
|
49
|
+
GET /api/hotspots/search?projectKey=ffroliva_gflow-cli&pullRequest=<N>&status=TO_REVIEW
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**3. Fix by condition — no gaming.**
|
|
53
|
+
|
|
54
|
+
- **`new_coverage < 80%`** → add **real** unit tests for the uncovered new lines
|
|
55
|
+
(usually a new orchestration/`_run_*`/helper). There is NO mark-safe shortcut and
|
|
56
|
+
NEVER widen `sonar.coverage.exclusions` to dodge it.
|
|
57
|
+
- **`new_code_smells` / `new_maintainability_rating` (e.g. S1192 duplicated literal,
|
|
58
|
+
S3776 cognitive complexity)** → fix at source. For a duplicated literal your diff
|
|
59
|
+
merely *touched*, collapse it to one module-scope alias so it falls under the
|
|
60
|
+
threshold (pyright/tests prove it's safe). For S7497, re-raise swallowed
|
|
61
|
+
`asyncio.CancelledError`.
|
|
62
|
+
- **`new_security_hotspots_reviewed < 100%`** → only for a **genuine** false positive:
|
|
63
|
+
`POST /api/hotspots/change_status` form body
|
|
64
|
+
`hotspot=<key>&status=REVIEWED&resolution=SAFE&comment=<justification>` (204 = ok),
|
|
65
|
+
then **re-run the SonarCloud job** so it reposts the GitHub status
|
|
66
|
+
(`gh run rerun <run-id> --job <sonar-job-id>` — the coverage artifact is reused).
|
|
67
|
+
Never mark a real hotspot SAFE.
|
|
68
|
+
|
|
69
|
+
**4. Push fixes, then re-verify from step 1** (the check must read `pass`).
|
|
70
|
+
|
|
71
|
+
## Output
|
|
72
|
+
|
|
73
|
+
- Verdict: **GREEN** (gate passed, zero new issues) or **RED** with the exact failing
|
|
74
|
+
conditions and a fix list (`file:line · rule · what to do`).
|
|
75
|
+
- After any fix: re-confirm via step 1 — green check = gate passed.
|
|
76
|
+
|
|
77
|
+
## See also
|
|
78
|
+
|
|
79
|
+
- `docs/GITHUB.md` § SonarCloud Quality Gate — full policy + coverage-exclusion rationale.
|
|
80
|
+
- `/gflow:check` — the local pre-commit gates (coverage floor pre-empts `new_coverage`).
|
|
81
|
+
- Memory: [[sonarcloud-pr-issues-scope-s7497]], [[sonarcloud-new-code-gotchas]],
|
|
82
|
+
[[sonarcloud-hotspot-review-workflow]], [[sonarcloud-setup]].
|
|
@@ -129,3 +129,14 @@
|
|
|
129
129
|
# scripts/dev/capture_locale_invariants.py or to live-verify a non-EN
|
|
130
130
|
# language end-to-end (see KNOWN_ISSUES § issue #24).
|
|
131
131
|
# GFLOW_CLI_LOCALE=en-US
|
|
132
|
+
|
|
133
|
+
# -----------------------------------------------------------------------------
|
|
134
|
+
# Headless Daemon (gflow serve)
|
|
135
|
+
# -----------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
# API Token header for gflow serve authentication (required when binding to non-local interface, e.g. 0.0.0.0).
|
|
138
|
+
# GFLOW_DAEMON_TOKEN=
|
|
139
|
+
|
|
140
|
+
# Port for gflow serve. Default is 8000.
|
|
141
|
+
# GFLOW_DAEMON_PORT=8000
|
|
142
|
+
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
name: Secret scan (gitleaks)
|
|
17
17
|
runs-on: ubuntu-latest
|
|
18
18
|
steps:
|
|
19
|
-
- uses: actions/checkout@
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 0 # full history so gitleaks can diff against base
|
|
22
22
|
|
|
@@ -25,6 +25,20 @@ jobs:
|
|
|
25
25
|
env:
|
|
26
26
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
27
27
|
|
|
28
|
+
# ── Security gate: dependency CVE audit against locked deps ──────────────
|
|
29
|
+
deps-audit:
|
|
30
|
+
name: Dependency audit (pip-audit)
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v7
|
|
34
|
+
- name: Install uv
|
|
35
|
+
uses: astral-sh/setup-uv@v7
|
|
36
|
+
- name: Audit locked dependencies for known CVEs
|
|
37
|
+
# Fails the build on any known advisory. Accept later via: pip-audit --ignore-vuln <GHSA-id>
|
|
38
|
+
run: |
|
|
39
|
+
uv export --frozen --format requirements-txt --no-emit-project > requirements-audit.txt
|
|
40
|
+
uvx pip-audit -r requirements-audit.txt
|
|
41
|
+
|
|
28
42
|
# ── Main test matrix ──────────────────────────────────────────────────────
|
|
29
43
|
test:
|
|
30
44
|
runs-on: ubuntu-latest
|
|
@@ -32,7 +46,7 @@ jobs:
|
|
|
32
46
|
matrix:
|
|
33
47
|
python-version: ["3.11", "3.12", "3.13"]
|
|
34
48
|
steps:
|
|
35
|
-
- uses: actions/checkout@
|
|
49
|
+
- uses: actions/checkout@v7
|
|
36
50
|
|
|
37
51
|
- name: Install uv
|
|
38
52
|
uses: astral-sh/setup-uv@v7
|
|
@@ -88,7 +102,7 @@ jobs:
|
|
|
88
102
|
github.event.pull_request.head.repo.full_name == github.repository
|
|
89
103
|
)
|
|
90
104
|
steps:
|
|
91
|
-
- uses: actions/checkout@
|
|
105
|
+
- uses: actions/checkout@v7
|
|
92
106
|
with:
|
|
93
107
|
fetch-depth: 0 # shallow clones break blame / new-code detection
|
|
94
108
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Guard main base
|
|
2
|
+
|
|
3
|
+
# Blocks the divergence class that bit v0.21.0: a non-release branch merged
|
|
4
|
+
# straight into `main` (PR #203 — base mistakenly set to `main`, then squashed),
|
|
5
|
+
# which bypassed `develop` and skipped the `main -> develop` back-merge, leaving
|
|
6
|
+
# `main` ahead of `develop` by an orphaned squash commit.
|
|
7
|
+
#
|
|
8
|
+
# Policy: only `chore/release-*` (cut by /gflow:release) or `hotfix/*` branches
|
|
9
|
+
# may target `main`. Everything else must go through `develop` (the default /
|
|
10
|
+
# integration branch). Dependabot and normal PRs already default to `develop`,
|
|
11
|
+
# so this only catches a deliberate, mistaken `--base main`.
|
|
12
|
+
#
|
|
13
|
+
# The job runs on EVERY PR and passes trivially when the base is not `main`, so
|
|
14
|
+
# it is safe to mark as a *required* status check on `main` without blocking
|
|
15
|
+
# `develop` PRs (which would otherwise hang as "expected — waiting").
|
|
16
|
+
|
|
17
|
+
on:
|
|
18
|
+
pull_request:
|
|
19
|
+
types: [opened, reopened, edited, synchronize]
|
|
20
|
+
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
jobs:
|
|
25
|
+
guard:
|
|
26
|
+
name: Only release/hotfix branches may target main
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- name: Verify base/head pairing
|
|
30
|
+
env:
|
|
31
|
+
BASE_REF: ${{ github.base_ref }}
|
|
32
|
+
HEAD_REF: ${{ github.head_ref }}
|
|
33
|
+
run: |
|
|
34
|
+
echo "PR head '$HEAD_REF' -> base '$BASE_REF'"
|
|
35
|
+
if [ "$BASE_REF" != "main" ]; then
|
|
36
|
+
echo "Base is '$BASE_REF' (not main) — nothing to enforce."
|
|
37
|
+
exit 0
|
|
38
|
+
fi
|
|
39
|
+
case "$HEAD_REF" in
|
|
40
|
+
chore/release-*|hotfix/*)
|
|
41
|
+
echo "OK: '$HEAD_REF' is allowed to target 'main'."
|
|
42
|
+
;;
|
|
43
|
+
*)
|
|
44
|
+
echo "::error title=Wrong base branch::PR head '$HEAD_REF' must not target 'main'."
|
|
45
|
+
echo "Only 'chore/release-*' (via /gflow:release) or 'hotfix/*' branches may merge into 'main'."
|
|
46
|
+
echo "Feature, CI, fix, docs, and dependency work must target 'develop' (the integration branch)."
|
|
47
|
+
echo "Fix: re-target this PR to 'develop', or — if this really is a release — rename the branch to 'chore/release-vX.Y.Z'."
|
|
48
|
+
exit 1
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
@@ -32,12 +32,15 @@ htmlcov/
|
|
|
32
32
|
.DS_Store
|
|
33
33
|
|
|
34
34
|
# Project-specific — secrets / session storage (NEVER commit)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
.
|
|
35
|
+
# NOTE: git does NOT support trailing inline comments in .gitignore — a `#` only
|
|
36
|
+
# starts a comment at the START of a line. Keep each pattern on its own line so
|
|
37
|
+
# the comment text isn't folded into the pattern (which silently un-ignores it).
|
|
38
|
+
/auth/
|
|
39
|
+
profile_*/
|
|
40
|
+
*.cookies.json
|
|
41
|
+
storage_state.json
|
|
42
|
+
secrets.json
|
|
43
|
+
.env
|
|
41
44
|
.env.local
|
|
42
45
|
.env.*.local
|
|
43
46
|
|
|
@@ -92,3 +95,7 @@ worktrees/
|
|
|
92
95
|
|
|
93
96
|
# Understand Anything (local knowledge graph)
|
|
94
97
|
.understand-anything/
|
|
98
|
+
.worktrees
|
|
99
|
+
|
|
100
|
+
# Subagent-driven-development scratch (ledger + task reports)
|
|
101
|
+
.superpowers/
|
|
@@ -50,6 +50,7 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
50
50
|
- Use `pytest -m "not live and not e2e and not smoke"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
|
|
51
51
|
- TDD is non-negotiable. Coverage floor: 80% overall.
|
|
52
52
|
- Documentation is a first-class deliverable. Every behavior, workflow, config, or operator-facing change must update the relevant docs or state why no docs changed in the PR/checklist. `scripts/ci/check_doc_links.py` is a merge gate.
|
|
53
|
+
- **A PR is not done until its SonarCloud gate is green (zero new issues).** The six gates above are local/pre-commit; SonarCloud is server-side and runs in CI (`sonar.qualitygate.wait=true` → a red gate turns the `SonarCloud analysis` check red). Before calling a PR merge-ready, verify it with `/gflow:sonar <N>` (it is skipped on fork PRs — maintainer-checked there).
|
|
53
54
|
- Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`. E2E tests require `GFLOW_CLI_E2E_PROFILE`.
|
|
54
55
|
|
|
55
56
|
## Code style
|
|
@@ -58,6 +59,7 @@ Or invoke the wrapper: `/gflow:check`.
|
|
|
58
59
|
- Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
|
|
59
60
|
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–22, e.g. 16 is the `DataStoreError` family, 19 `SceneConcatError`, 20 `FrameExtractionError`, 21 `ChainPartialError`, 22 `UpscaleUnavailableError`). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
|
|
60
61
|
- 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
|
|
62
|
+
- **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_server.py`.
|
|
61
63
|
|
|
62
64
|
## PR instructions
|
|
63
65
|
|
|
@@ -80,7 +82,7 @@ The `skills/` directory ships installable agent skill docs in plain Markdown wit
|
|
|
80
82
|
| `status` | [`skills/status/SKILL.md`](skills/status/SKILL.md) | Show current plan state, progress, and next unchecked task |
|
|
81
83
|
| `pr-council-review` | [`skills/pr-council-review/SKILL.md`](skills/pr-council-review/SKILL.md) | Multi-dimensional PR council review |
|
|
82
84
|
|
|
83
|
-
**Cursor / Aider / Codex / Gemini CLI:** paste or include the relevant `SKILL.md` in your system context.
|
|
85
|
+
**Cursor / Aider / Codex / Gemini CLI (`agy`):** paste or include the relevant `SKILL.md` in your system context. Note: in the `agy` TUI prompt, custom slash commands (e.g. `/gflow:pr-council-review`) are blocked by the TUI's command parser. Type them as plain text without the leading slash (e.g. `gflow:pr-council-review`, `gflow:branch-review`, or `gflow:check`) to trigger the corresponding agent skill workflow.
|
|
84
86
|
**Claude Code:** the `/gflow:` slash commands in `.claude/commands/gflow/` are auto-discovered when the project is open — no extra setup needed. To register a skill globally, copy the command file to `~/.claude/commands/`.
|
|
85
87
|
**Custom agents:** fetch `skills/gflow-cli/SKILL.md` into your knowledge base before answering gflow questions.
|
|
86
88
|
|
|
@@ -7,6 +7,69 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.22.0] — 2026-06-28
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Tools framework ("Creative Director")**: a TOML-defined prompt-tool system with
|
|
15
|
+
`creative-director` as the first built-in tool, exposed via two surfaces:
|
|
16
|
+
- **`gflow tools list/show/run`** — discover tools, inspect their styles, and run them
|
|
17
|
+
standalone (e.g. `gflow tools run creative-director "a cat" --style cinema --json`).
|
|
18
|
+
- **`-t` / `--tool` option** on every generation command — `image t2i` / `i2i` / `batch`,
|
|
19
|
+
`video t2v` / `i2v` / `r2v` / `chain` — apply one or more tools before generating
|
|
20
|
+
(e.g. `--tool creative-director:style=cinema`). Repeatable. On multi-prompt batches and
|
|
21
|
+
chains the tool is applied per prompt/link. Replaces the never-released `-e/--expand` flag.
|
|
22
|
+
- The `creative-director` tool rewrites a terse prompt into a vivid one using Google's
|
|
23
|
+
five-component formula (Subject + Action + Context/Location + Composition/Camera + Style)
|
|
24
|
+
via the public Gemini API. Requires `GFLOW_CLI_GEMINI_API_KEY`
|
|
25
|
+
([get one](https://aistudio.google.com/apikey)); optional `GFLOW_CLI_GEMINI_MODEL`
|
|
26
|
+
(default `gemini-2.5-flash`). Domain-vocabulary modes (`--style cinema`, `portrait`,
|
|
27
|
+
`product`, etc.) inject specialized lens/lighting/colour vocabulary; styles are
|
|
28
|
+
**category-gated**, so image styles apply to image commands and video styles to video.
|
|
29
|
+
- Tool application is **never fatal** — missing key, rate limit, or any API/network fault
|
|
30
|
+
degrades gracefully to the original prompt.
|
|
31
|
+
- **History**: a generation rewritten by a tool records the user's original prompt in the
|
|
32
|
+
`prompt` column, the submitted expansion in `expanded_prompt`, and the applied tool
|
|
33
|
+
(`{name, version, model, params, config_hash}`) in `operations.metadata_json.tool` — all
|
|
34
|
+
honoring `GFLOW_CLI_HISTORY_PROMPTS=redacted` (the redacted form stores only
|
|
35
|
+
`{name, version, params_hash, config_hash}`).
|
|
36
|
+
- MCP parity: `gflow_list_tools` tool and a `tools` array parameter (`[{name, options}]`) on
|
|
37
|
+
`gflow_generate_image` / `gflow_generate_video`, validated and adapted to the CLI
|
|
38
|
+
`--tool` form.
|
|
39
|
+
- **"My Tools"**: drop your own tool TOMLs into `<GFLOW_CLI_HOME>/tools/*.toml` and they are
|
|
40
|
+
registered automatically — listed by `gflow tools list`, usable via `--tool`, and exposed over
|
|
41
|
+
MCP, just like built-ins. A user tool may override a built-in of the same name (logged via
|
|
42
|
+
`tool_user_override`); a malformed user TOML fails loud. See [docs/TOOLS.md](docs/TOOLS.md).
|
|
43
|
+
- The Gemini prompt expander gained an overall **wall-clock budget** (default ~60s per call)
|
|
44
|
+
on top of the lowered 20s per-attempt timeout, so sustained rate limiting can no longer
|
|
45
|
+
block a generation for the full retry schedule before falling back to the original prompt.
|
|
46
|
+
|
|
47
|
+
### Deprecated
|
|
48
|
+
|
|
49
|
+
- **`expand_prompt` MCP prompt**: superseded by the `creative-director` tool, which performs the
|
|
50
|
+
rewrite server-side (calls Gemini, strips banned keywords, supports domain styles, records
|
|
51
|
+
provenance). The prompt still works and now carries a `[DEPRECATED]` marker in its
|
|
52
|
+
client-visible description; it is slated for removal in a future major release. Use
|
|
53
|
+
`gflow tools run creative-director` / `--tool` (CLI) or `gflow_list_tools` + the `tools` array
|
|
54
|
+
param (MCP) instead.
|
|
55
|
+
|
|
56
|
+
## [0.21.0] — 2026-06-26
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **MCP server** (`gflow mcp run`): a [Model Context Protocol](https://modelcontextprotocol.io) server over **stdio** that exposes gflow's image / video / data operations to MCP-aware agents (Claude Desktop, Cursor, VS Code) as JSON-RPC **tools, resources, and prompts**. Point the client at `gflow mcp run` (example config in `gflow mcp run --help` and [docs/MCP.md](docs/MCP.md)). `gflow mcp setup --target <claude-desktop|cursor|vscode>` is scaffolded for future auto-configuration.
|
|
61
|
+
- **MCP over HTTP/SSE** (`gflow serve`): serves the same MCP server over Server-Sent Events — stream at `/sse`, POST messages to `/messages/`. Binds `127.0.0.1:8000` by default; non-loopback binds require `GFLOW_DAEMON_TOKEN`. Foundation for the forthcoming Gflow Studio Web UI and REST `/api/v1` surface.
|
|
62
|
+
- **Daemon & generation-queue scaffolding** (internal foundation): a FastAPI lifespan daemon, a `FlowWorker` background processor, and a SQLite-backed generation queue (`QueueRepository` + migration `0007_queue`, swept to `failed` on restart). Lays the groundwork for queued asynchronous generation; not yet wired into a user command (`gflow serve` currently runs the MCP/SSE server only).
|
|
63
|
+
|
|
64
|
+
### Fixed
|
|
65
|
+
|
|
66
|
+
- **Security — `cryptography` advisory** ([GHSA-537c-gmf6-5ccf](https://github.com/advisories/GHSA-537c-gmf6-5ccf)): bumped the locked `cryptography` from 48.0.0 to 49.0.0 (transitive dependency).
|
|
67
|
+
|
|
68
|
+
### Changed
|
|
69
|
+
|
|
70
|
+
- **CI — dependency CVE gate**: added a `pip-audit` job that audits the locked dependency set on every PR and fails on known advisories.
|
|
71
|
+
- **Code health**: SonarCloud cleanup sweep across the CLI, API, transport drivers, and movie/manifest layers (cognitive-complexity, duplicate-literal, and unused-argument refactors) with no behavioral change.
|
|
72
|
+
|
|
10
73
|
## [0.20.1] — 2026-06-16
|
|
11
74
|
|
|
12
75
|
### Fixed
|
|
@@ -1565,7 +1628,9 @@ shell-script template that branches on these codes.
|
|
|
1565
1628
|
|
|
1566
1629
|
First skeleton. Not functional end-to-end yet.
|
|
1567
1630
|
|
|
1568
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
1631
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.22.0...HEAD
|
|
1632
|
+
[0.22.0]: https://github.com/ffroliva/gflow-cli/compare/v0.21.0...v0.22.0
|
|
1633
|
+
[0.21.0]: https://github.com/ffroliva/gflow-cli/compare/v0.20.1...v0.21.0
|
|
1569
1634
|
[0.20.1]: https://github.com/ffroliva/gflow-cli/compare/v0.20.0...v0.20.1
|
|
1570
1635
|
[0.20.0]: https://github.com/ffroliva/gflow-cli/compare/v0.19.0...v0.20.0
|
|
1571
1636
|
[0.19.0]: https://github.com/ffroliva/gflow-cli/compare/v0.18.0...v0.19.0
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
| `GFLOW_CLI_BROWSER` | `auto` | Browser mode. See **Browser mode** section below. |
|
|
10
10
|
| `CHROME_BINARY` | (autodetect) | Override Chrome binary path. Falls back to platform-standard locations. |
|
|
11
11
|
| `GFLOW_CLI_CONCURRENCY` | `4` | Maximum parallel API requests per batch. |
|
|
12
|
+
| `GFLOW_CLI_GEMINI_API_KEY` | _(unset)_ | Public Gemini key enabling prompt expansion (`-e`/`--expand`). Unset = expansion is a graceful no-op. [Get one](https://aistudio.google.com/apikey). |
|
|
13
|
+
| `GFLOW_CLI_GEMINI_MODEL` | `gemini-2.5-flash` | Gemini model used for prompt expansion. |
|
|
12
14
|
| `GFLOW_LIVE` | _(unset)_ | Set to `1` to enable live-API test markers (`@pytest.mark.live`). |
|
|
13
15
|
|
|
14
16
|
---
|
|
@@ -102,6 +102,23 @@ pip install pre-commit && pre-commit install
|
|
|
102
102
|
|
|
103
103
|
The `.pre-commit-config.yaml` already ships ruff and the hygiene gate.
|
|
104
104
|
|
|
105
|
+
### SonarCloud quality gate
|
|
106
|
+
|
|
107
|
+
On top of the six gates, CI runs a **SonarCloud** analysis whose quality gate must be
|
|
108
|
+
**green** before a PR is merge-ready — the target is **zero new issues** on changed code
|
|
109
|
+
(new bugs, vulnerabilities, and code smells = 0; coverage of new lines ≥ 80%; security
|
|
110
|
+
hotspots reviewed = 100%). The local `--cov-fail-under=80` gate already pre-empts the
|
|
111
|
+
coverage condition, so if your tests are green locally you have usually cleared the part
|
|
112
|
+
of the gate you can run yourself.
|
|
113
|
+
|
|
114
|
+
SonarCloud is **server-side and maintainer-run**: it needs a repo secret (`SONAR_TOKEN`)
|
|
115
|
+
that, for security, GitHub does **not** share with pull requests from forks. So **on a
|
|
116
|
+
fork PR the SonarCloud check is skipped** — you cannot run it, and that is expected. A
|
|
117
|
+
maintainer checks the gate before merging (and, for fork PRs, may re-run the branch
|
|
118
|
+
internally to produce an analysis). Don't worry if you see the SonarCloud check absent or
|
|
119
|
+
skipped on your PR; focus on keeping the six local gates green and your diff free of new
|
|
120
|
+
smells. Full policy: [`docs/GITHUB.md`](docs/GITHUB.md) § SonarCloud Quality Gate.
|
|
121
|
+
|
|
105
122
|
### Script output convention
|
|
106
123
|
|
|
107
124
|
All runtime output — smoke runs, debug dumps, generated images — **must** go
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# GEMINI.md
|
|
2
|
+
|
|
3
|
+
> Project memory hub for **Gemini CLI**. The universal coding-agent rules for any tool (Cursor, Codex, Aider, Gemini CLI, etc.) live in [AGENTS.md](AGENTS.md) — this file carries Gemini-specific session protocol only.
|
|
4
|
+
|
|
5
|
+
## What this project is
|
|
6
|
+
|
|
7
|
+
`gflow-cli` is an unofficial Python CLI that drives [Google Flow](https://labs.google/fx/tools/flow) (Veo image-to-video, Imagen text-to-image) from the terminal by reverse-engineering Flow's private REST API. See [README.md](README.md) for the user-facing overview.
|
|
8
|
+
|
|
9
|
+
## On every session start
|
|
10
|
+
|
|
11
|
+
1. Read **[AGENTS.md](AGENTS.md)** — universal rules every agent must follow.
|
|
12
|
+
2. Read **[docs/INDEX.md](docs/INDEX.md)** — routing layer for all project docs and commands.
|
|
13
|
+
3. Pull deeper context on demand (type as plain text in the `agy` TUI prompt):
|
|
14
|
+
- Current task / where we left off → `gflow:status`
|
|
15
|
+
- Starting a new feature → `gflow:predict` → `gflow:scenario` → `gflow:plan <feature>`
|
|
16
|
+
- Touching auth or reCAPTCHA → `gflow:known-issues`
|
|
17
|
+
- Cutting a release → `gflow:release`
|
|
18
|
+
- Before any commit → `gflow:check`
|
|
19
|
+
|
|
20
|
+
## Gemini-specific
|
|
21
|
+
|
|
22
|
+
- Use specialized skills when relevant (e.g., `find-docs` for library research, `pr-council-review` for PR audits).
|
|
23
|
+
- Maintain memory via the `mcp-mempalace` tool if available.
|
|
24
|
+
- Prioritize **turn efficiency** and **high-signal output**.
|
|
25
|
+
|
|
26
|
+
## Active phase
|
|
27
|
+
|
|
28
|
+
- **Decoupled Daemon/Worker Plan:** The blueprint for the headless SSE Daemon, SQLite generation queue, and Tauri/React editor is scheduled in [PLAN.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/PLAN.md) and [SCENARIO.md](file:///C:/development/github/gflow-cli/docs/superpowers/plans/2026-06-23-mcp-ui-worker-integration/SCENARIO.md).
|
|
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
|
+
|
|
31
|
+
See [PLAN.md](PLAN.md) or type `gflow:status` for the current task. Type `gflow:plan <feature>` to create a new feature plan.
|