gflow-cli 0.7.0__tar.gz → 0.8.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.8.0/.claude/commands/gflow/doc-review.md +137 -0
- gflow_cli-0.8.0/.claude/commands/gflow/release.md +168 -0
- gflow_cli-0.8.0/.continue-here.md +118 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.gitignore +3 -0
- gflow_cli-0.8.0/.planning/todos/pending/pr-38-review.md +8 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CHANGELOG.md +126 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CLAUDE.md +6 -6
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/KNOWN_ISSUES.md +101 -2
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/PKG-INFO +31 -21
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/PLAN.md +45 -8
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/README.md +30 -20
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/DEBUGGING.md +16 -3
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/INDEX.md +2 -0
- gflow_cli-0.8.0/docs/LIVE_VERIFICATION_image_batch.md +355 -0
- gflow_cli-0.8.0/docs/LIVE_VERIFICATION_video_download.md +97 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/USAGE.md +59 -7
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +784 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +632 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +2410 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-22-pr-38-review.md +107 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +1907 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +457 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +40 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +389 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/pyproject.toml +2 -1
- gflow_cli-0.8.0/scripts/dev/monitor_pr_38.py +37 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/client.py +65 -91
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/dto.py +22 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/bearer.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +4 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/ui_automation.py +759 -35
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/ui_automation_video.py +51 -6
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/video.py +12 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/internal_chromium.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/real_chrome.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/verification.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/browser_manager.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/cli_image.py +146 -52
- gflow_cli-0.8.0/src/gflow_cli/cli_video.py +153 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/errors.py +65 -0
- gflow_cli-0.8.0/src/gflow_cli/image_batch.py +877 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/observability.py +1 -1
- gflow_cli-0.8.0/test_assets/sample_batch.json +5 -0
- gflow_cli-0.8.0/test_assets/sample_batch.tsv +3 -0
- gflow_cli-0.8.0/test_assets/sample_batch_invalid.tsv +4 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_client.py +16 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_client_image.py +67 -164
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_dto.py +57 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_video.py +23 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_ui_automation.py +611 -0
- gflow_cli-0.8.0/tests/api/transports/test_ui_automation_batch.py +1169 -0
- gflow_cli-0.8.0/tests/api/transports/test_ui_automation_image_mode.py +177 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_ui_automation_video.py +61 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/auth/strategies/test_strategies.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_cli_image.py +57 -13
- gflow_cli-0.8.0/tests/cli/test_cli_image_seed_removed.py +31 -0
- gflow_cli-0.8.0/tests/cli/test_cli_video.py +68 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_t2i_multi_prompt.py +0 -9
- gflow_cli-0.8.0/tests/e2e/test_image_batch_e2e.py +205 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_image_steps.py +0 -1
- gflow_cli-0.8.0/tests/image_batch/test_image_manifest.py +384 -0
- gflow_cli-0.8.0/tests/image_batch/test_observability_events.py +185 -0
- gflow_cli-0.8.0/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_errors.py +38 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/uv.lock +90 -1
- gflow_cli-0.7.0/.claude/commands/gflow/release.md +0 -118
- gflow_cli-0.7.0/src/gflow_cli/cli_video.py +0 -95
- gflow_cli-0.7.0/src/gflow_cli/image_batch.py +0 -442
- gflow_cli-0.7.0/tests/test_cli_video.py +0 -44
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.env.template +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.gitattributes +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.planning/todos/pending/2026-05-11-add-project-logo-and-docs-site-promotion-plan.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/.secrets.baseline +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/LICENSE +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/RELEASE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/ARCHITECTURE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/GITHUB.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/2026-05-14-shell-multi-prompt-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_FINAL_SEC_UX_VERIFIED.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_PLAN_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/COUNCIL_REVIEW_SPEC_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/diag_capture_flow_traffic.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/diag_recaptcha_mint.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/skills/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/sonar-project.properties +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tasks/lessons.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/conftest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/conftest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.7.0/tests/smoke → gflow_cli-0.8.0/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_config.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.0}/tests/test_smoke.py +0 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Use before cutting any gflow-cli release or after a major feature lands — systematic audit of version refs, INDEX completeness, per-release evidence files, CHANGELOG footer, skill files, and memory records for staleness.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:doc-review` — Documentation Review Gate
|
|
6
|
+
|
|
7
|
+
Run this gate before cutting a release. Every item reports **PASS / UPDATED / WARN / FAIL**. Any **FAIL** blocks the release.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Version references
|
|
12
|
+
|
|
13
|
+
Check these files for stale version strings (old numbers, outdated status labels):
|
|
14
|
+
|
|
15
|
+
| File | What to verify |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `README.md` | Status badge, "What's new" section, install example, milestone table |
|
|
18
|
+
| `CLAUDE.md` | `Active phase` — version, PyPI status, active backlog pointer |
|
|
19
|
+
| `PLAN.md` | Phase status (`IN PROGRESS` / `DONE`) and version annotations |
|
|
20
|
+
| `KNOWN_ISSUES.md` | `Open` entries resolved by this release → move to `Resolved` with evidence |
|
|
21
|
+
| `CHANGELOG.md` | `[Unreleased]` empty; link footer matches new version |
|
|
22
|
+
| `pyproject.toml` + `src/gflow_cli/__init__.py` | Both set to the new version |
|
|
23
|
+
|
|
24
|
+
Quick grep to spot stragglers:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
grep -rn "v[0-9]\+\.[0-9]" README.md CLAUDE.md PLAN.md KNOWN_ISSUES.md CHANGELOG.md pyproject.toml
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. `docs/INDEX.md` completeness
|
|
33
|
+
|
|
34
|
+
Every `.md` in `docs/` needs an entry; every entry must point to a real file.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# files in docs/ missing from INDEX.md
|
|
38
|
+
for f in docs/*.md; do
|
|
39
|
+
grep -q "$(basename "$f")" docs/INDEX.md || echo "MISSING from INDEX: $f"
|
|
40
|
+
done
|
|
41
|
+
|
|
42
|
+
# entries in INDEX.md pointing to deleted files
|
|
43
|
+
grep -o 'docs/[^)]*\.md' docs/INDEX.md | while read path; do
|
|
44
|
+
[ -f "$path" ] || echo "DEAD LINK in INDEX: $path"
|
|
45
|
+
done
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 3. Per-release evidence file
|
|
51
|
+
|
|
52
|
+
After each release a `docs/LIVE_VERIFICATION_vX.Y.Z.md` must exist.
|
|
53
|
+
|
|
54
|
+
- Latest version has one (create stub if live run already documented elsewhere)
|
|
55
|
+
- `docs/INDEX.md` has an entry for it
|
|
56
|
+
- Previous versions' files are preserved (historical record — never delete)
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## 4. `.claude/commands/gflow/` skill files
|
|
61
|
+
|
|
62
|
+
Scan all skills for stale phase/version references:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
grep -rn "v[0-9]\+\.[0-9]\|Phase [A-Z0-9]" .claude/commands/gflow/
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Update in the release prep commit if any references are wrong.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 5. CHANGELOG link footer
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Verify [Unreleased] compares from the new version, not an older one
|
|
76
|
+
tail -10 CHANGELOG.md
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Must read: `[Unreleased]: …compare/vNEW_VERSION…HEAD`
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 6. Memory files
|
|
84
|
+
|
|
85
|
+
Check `C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory\`:
|
|
86
|
+
|
|
87
|
+
| File | What to verify |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `MEMORY.md` | All listed files exist; no dangling entries |
|
|
90
|
+
| `phase-b-followups.md` | Items shipped in this release marked done |
|
|
91
|
+
| `video-generation-spec.md` | PR/status accurate |
|
|
92
|
+
| `image-generation-401-next.md` | Resolution status and evidence pointer still valid |
|
|
93
|
+
| `release-signing.md` | Procedure section matches what was actually done |
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Check MEMORY.md index integrity
|
|
97
|
+
cd "C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory"
|
|
98
|
+
grep -o '\[.*\]([^)]*\.md)' MEMORY.md | grep -o '([^)]*)' | tr -d '()' | while read f; do
|
|
99
|
+
[ -f "$f" ] || echo "DEAD LINK: $f"
|
|
100
|
+
done
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 7. Stale file cleanup (optional)
|
|
106
|
+
|
|
107
|
+
Flag (do not delete without user confirmation):
|
|
108
|
+
|
|
109
|
+
- Temporary debugging artifacts in `docs/` or repo root that were never meant to be permanent
|
|
110
|
+
- Draft specs whose work has fully shipped (move to `docs/archive/` or add "SHIPPED" header)
|
|
111
|
+
- `LIVE_VERIFICATION` files older than two releases that could be archived
|
|
112
|
+
|
|
113
|
+
Always ask the user before removing or archiving.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Output format
|
|
118
|
+
|
|
119
|
+
After each section write one line:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
[1] Version refs — PASS
|
|
123
|
+
[2] INDEX completeness — UPDATED (added LIVE_VERIFICATION_v0.7.0.md entry)
|
|
124
|
+
[3] Evidence file — PASS
|
|
125
|
+
[4] Skill files — UPDATED (removed stale "Phase A in progress" in plan.md)
|
|
126
|
+
[5] CHANGELOG footer — PASS
|
|
127
|
+
[6] Memory files — WARN: release-signing.md procedure section may need update — check with user
|
|
128
|
+
[7] Stale files — PASS
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Then list every **UPDATED** change and every **WARN** / **FAIL** finding for the user to review.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Integration with `/gflow:release`
|
|
136
|
+
|
|
137
|
+
This skill is invoked at **step 9** of `/gflow:release` (between "review commands for staleness" and "commit the release prep"). All discovered fixes are folded into the release prep commit unless genuinely unrelated to the release.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Cut a new gflow-cli release — bump version, update CHANGELOG, tag, push, and back-merge.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:release` — Cut a new release
|
|
6
|
+
|
|
7
|
+
Follow this sequence verbatim. Every step matters.
|
|
8
|
+
|
|
9
|
+
> **Branch-protection note:** `main` blocks direct pushes. The release commit travels
|
|
10
|
+
> via a `chore/release-vX.Y.Z` branch PR. The signed tag is pushed independently
|
|
11
|
+
> (tag pushes bypass branch protection and trigger the CI release workflow immediately).
|
|
12
|
+
|
|
13
|
+
## Inputs
|
|
14
|
+
|
|
15
|
+
Ask the user (if not already provided):
|
|
16
|
+
|
|
17
|
+
1. **Version** — the new version (e.g. `0.4.0`, `0.4.0a3`, `1.0.0rc1`). Use PEP 440 prerelease suffixes (`aN`, `bN`, `rcN`). If they don't know, run `/gflow:changelog` first and propose the next bump (PATCH for fixes only, MINOR for new features, MAJOR for breaks).
|
|
18
|
+
2. **Pre-release?** — prerelease versions stay marked as GitHub prereleases. Only the user can say when a release line is ready for the stable tag.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Sequence
|
|
23
|
+
|
|
24
|
+
**1. Review what's queued.**
|
|
25
|
+
|
|
26
|
+
Run `/gflow:changelog` — confirm the `[Unreleased]` block is non-empty and accurate before proceeding.
|
|
27
|
+
|
|
28
|
+
**2. Verify clean working tree.**
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
git status --short
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Must be empty. If not, abort and tell the user to commit or stash first.
|
|
35
|
+
|
|
36
|
+
**3. Verify `main` is up-to-date.**
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
git rev-parse --abbrev-ref HEAD # must be "main"
|
|
40
|
+
git fetch origin
|
|
41
|
+
git rev-list HEAD..origin/main # must be empty
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
If not on `main`, switch: `git checkout main && git pull origin main`.
|
|
45
|
+
If `main` is behind, pull first.
|
|
46
|
+
|
|
47
|
+
**4. Run quality gates.**
|
|
48
|
+
|
|
49
|
+
Run `/gflow:check` — all gates must pass. Abort if any fail.
|
|
50
|
+
|
|
51
|
+
**5. Create a release branch.**
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git checkout -b chore/release-v<NEW_VERSION>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
All release prep commits live here; this branch gets PR'd into `main`.
|
|
58
|
+
|
|
59
|
+
**6. Bump version** in `pyproject.toml`:
|
|
60
|
+
|
|
61
|
+
```toml
|
|
62
|
+
[project]
|
|
63
|
+
version = "<NEW_VERSION>"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**7. Bump package version** in `src/gflow_cli/__init__.py`:
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
__version__ = "<NEW_VERSION>"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**8. Update version assertion tests** if present:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
rg -n "__version__|<OLD_VERSION>|version assertion" tests src pyproject.toml
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**9. Migrate CHANGELOG.**
|
|
79
|
+
|
|
80
|
+
- Move all entries under `## [Unreleased]` to a new `## [<NEW_VERSION>] — YYYY-MM-DD` section.
|
|
81
|
+
- Leave `## [Unreleased]` empty.
|
|
82
|
+
- Update the link footer:
|
|
83
|
+
```
|
|
84
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v<NEW_VERSION>...HEAD
|
|
85
|
+
[<NEW_VERSION>]: https://github.com/ffroliva/gflow-cli/releases/tag/v<NEW_VERSION>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**10. Run the documentation review gate.**
|
|
89
|
+
|
|
90
|
+
Run `/gflow:doc-review` — audit all version refs, INDEX completeness, evidence files, skill files, CHANGELOG footer, and memory files. Fix every **FAIL** before continuing. Fold all discovered fixes into the release prep commit.
|
|
91
|
+
|
|
92
|
+
**11. Commit the release prep.**
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
git add pyproject.toml src/gflow_cli/__init__.py CHANGELOG.md
|
|
96
|
+
git add docs/ .claude/commands/gflow/ # include any doc-review fixes
|
|
97
|
+
git commit -m "chore(release): v<NEW_VERSION>"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**12. Tag the release commit.** Use `-s` for a signed annotated tag so GitHub shows **"Verified"** AND `.github/workflows/release.yml` passes the signed-tag gate (unsigned or lightweight tags are rejected by CI).
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
git tag -s v<NEW_VERSION> -m "v<NEW_VERSION>"
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Signing requirements:
|
|
107
|
+
- **SSH signing (preferred):** `git config --global gpg.format ssh` + `user.signingkey` pointing at your public key.
|
|
108
|
+
- **GPG:** any registered GPG key works.
|
|
109
|
+
- Run `git config --global user.signingkey` to confirm a key is configured.
|
|
110
|
+
|
|
111
|
+
**13. Push the tag first** (bypasses branch protection; triggers the CI release workflow immediately):
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
git push origin v<NEW_VERSION>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
CI will start building the release. Watch <https://github.com/ffroliva/gflow-cli/actions>.
|
|
118
|
+
|
|
119
|
+
**14. Push the release branch and open the PR.**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
git push origin chore/release-v<NEW_VERSION>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Open PR `chore/release-v<NEW_VERSION> → main` with title `chore(release): v<NEW_VERSION>`. Merge it once CI is green. (The release workflow already ran from the tag push in step 13 — the PR is to keep `main` up-to-date with the bump commit.)
|
|
126
|
+
|
|
127
|
+
**15. Back-merge `main` into `develop`.**
|
|
128
|
+
|
|
129
|
+
After the release PR is merged, bring the bump commit back to `develop` so branches stay aligned:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
git checkout develop
|
|
133
|
+
git pull origin develop
|
|
134
|
+
git fetch origin main
|
|
135
|
+
git merge origin/main --no-ff -m "chore: back-merge main (v<NEW_VERSION>) into develop"
|
|
136
|
+
git push origin develop
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
If there are conflicts (rare — only if `develop` has commits that touched the same lines as the bump), resolve them, keeping `develop`'s unreleased work and `main`'s version bump.
|
|
140
|
+
|
|
141
|
+
**16. Report.**
|
|
142
|
+
|
|
143
|
+
Tell the user:
|
|
144
|
+
- Tag push triggered `.github/workflows/release.yml`.
|
|
145
|
+
- Watch <https://github.com/ffroliva/gflow-cli/actions> for the release workflow.
|
|
146
|
+
- On success: PyPI publish + GitHub Release with auto-generated notes.
|
|
147
|
+
- On failure (most common: PyPI Trusted Publishing not yet configured): point to <https://pypi.org/manage/account/publishing/>.
|
|
148
|
+
- `develop` is now synced with `main` (back-merge done in step 15).
|
|
149
|
+
- Next development cycle starts on `develop` — open `## [Unreleased]` in CHANGELOG is ready.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Critical reminders
|
|
154
|
+
|
|
155
|
+
- **NEVER** add `Co-Authored-By: Claude` (or any AI co-author) to the release commit.
|
|
156
|
+
- **NEVER** force-push a release tag once it's on GitHub. Ship a PATCH fix instead.
|
|
157
|
+
- **NEVER** `--no-verify` past hooks. Fix the underlying issue.
|
|
158
|
+
- **NEVER** push directly to `main` — branch protection will reject it. Always use a PR.
|
|
159
|
+
- If quality gates fail at step 4, **STOP**. Surface the failures to the user.
|
|
160
|
+
- If doc-review fails at step 10, **STOP**. Fix before committing.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## See also
|
|
165
|
+
|
|
166
|
+
- [RELEASE.md](../../../RELEASE.md) — full release protocol, prerelease policy, and checklist
|
|
167
|
+
- [README § Releases](../../../README.md#releases) — release policy and cadence
|
|
168
|
+
- [PLAN § Phase 5](../../../PLAN.md#phase-5--public-alpha-release-on-pypi) — first-release exit criteria
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase: phase-b-video-download
|
|
3
|
+
task: 0
|
|
4
|
+
total_tasks: 6
|
|
5
|
+
status: ready_to_execute
|
|
6
|
+
last_updated: 2026-05-20T16:22:15.971Z
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<current_state>
|
|
10
|
+
Plan written and saved. No code written yet. Ready to execute Task 1 of 6.
|
|
11
|
+
|
|
12
|
+
Branch: develop (clean, up-to-date after back-merge of main v0.7.0)
|
|
13
|
+
Plan file: docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md
|
|
14
|
+
</current_state>
|
|
15
|
+
|
|
16
|
+
<completed_work>
|
|
17
|
+
|
|
18
|
+
This session (prior to plan writing):
|
|
19
|
+
- v0.7.0 release protocol fixed: new /gflow:release (16 steps) with branch-protection-aware push, doc-review gate, back-merge step
|
|
20
|
+
- New /gflow:doc-review skill created at .claude/commands/gflow/doc-review.md
|
|
21
|
+
- PR #34 merged to develop; back-merge main (v0.7.0) → develop done (d012bcd)
|
|
22
|
+
- Memory items D and F in phase-b-followups.md marked resolved
|
|
23
|
+
- develop is fully clean and synced with main
|
|
24
|
+
|
|
25
|
+
Plan tasks (NOT YET STARTED — all 6 remain):
|
|
26
|
+
- Task 1: VideoResult dataclass in api/video.py
|
|
27
|
+
- Task 2: _download_video helper on VideoGenerationMixin
|
|
28
|
+
- Task 3: generate_video returns VideoResult, gains download=True param
|
|
29
|
+
- Task 4: FlowApiClient.download_video wraps self.download()
|
|
30
|
+
- Task 5: gflow video t2v CLI restored (--aspect / --profile / --out-dir)
|
|
31
|
+
- Task 6: CHANGELOG entries
|
|
32
|
+
</completed_work>
|
|
33
|
+
|
|
34
|
+
<remaining_work>
|
|
35
|
+
|
|
36
|
+
All 6 plan tasks. Execute in order — each has TDD steps (RED→GREEN→commit).
|
|
37
|
+
|
|
38
|
+
Task 1: VideoResult dataclass
|
|
39
|
+
- Add to src/gflow_cli/api/video.py after VideoStatus
|
|
40
|
+
- Test in tests/api/test_video.py
|
|
41
|
+
|
|
42
|
+
Task 2: _download_video on VideoGenerationMixin
|
|
43
|
+
- Add to src/gflow_cli/api/transports/ui_automation_video.py
|
|
44
|
+
- Uses page.request.get(routes.media_download_url(media_id), max_redirects=5, timeout=180_000)
|
|
45
|
+
- Test in tests/api/transports/test_ui_automation_video.py
|
|
46
|
+
|
|
47
|
+
Task 3: Update generate_video signature
|
|
48
|
+
- Add download: bool = True param
|
|
49
|
+
- Return type VideoStatus → VideoResult
|
|
50
|
+
- After _poll_video_status: if download and status.succeeded → _download_video
|
|
51
|
+
- Both generate_video and _generate_video_locked change signatures
|
|
52
|
+
|
|
53
|
+
Task 4: FlowApiClient.download_video
|
|
54
|
+
- 3-line wrapper: return await self.download(media_id, out_path)
|
|
55
|
+
- Add after download_image in src/gflow_cli/api/client.py
|
|
56
|
+
- Test in tests/api/test_client.py
|
|
57
|
+
|
|
58
|
+
Task 5: cli_video.py T2V restoration
|
|
59
|
+
- Replace entire file content (plan has full replacement)
|
|
60
|
+
- Uses UiAutomationTransport directly (not FlowApiClient)
|
|
61
|
+
- prompt becomes required argument (was optional)
|
|
62
|
+
- New options: --aspect (9:16/16:9), --profile, --out-dir
|
|
63
|
+
- Test in tests/cli/test_cli_video.py
|
|
64
|
+
|
|
65
|
+
Task 6: CHANGELOG
|
|
66
|
+
- Add entries under [Unreleased]
|
|
67
|
+
</remaining_work>
|
|
68
|
+
|
|
69
|
+
<decisions_made>
|
|
70
|
+
|
|
71
|
+
- VideoResult(status: VideoStatus, local_path: Path | None) — new frozen dataclass,
|
|
72
|
+
NOT a tuple, for clean ergonomics (same pattern as GeneratedImage on image side)
|
|
73
|
+
|
|
74
|
+
- generate_video is a breaking change (VideoStatus → VideoResult return type) —
|
|
75
|
+
acceptable in Phase B; no external callers known
|
|
76
|
+
|
|
77
|
+
- _run_t2v uses UiAutomationTransport directly, NOT FlowApiClient —
|
|
78
|
+
YAGNI: FlowApiClient.generate_video wrapper deferred; transport pattern
|
|
79
|
+
proven by tmp/fetch_video.py
|
|
80
|
+
|
|
81
|
+
- Download uses page.request.get (Playwright, follows 302 natively) NOT httpx —
|
|
82
|
+
httpx _download static method is image-only and doesn't follow redirects;
|
|
83
|
+
video needs the 302 to GCS followed with auth context
|
|
84
|
+
|
|
85
|
+
- Aspect.from_cli() used in CLI (not a hand-rolled mapping) — already exists in
|
|
86
|
+
src/gflow_cli/api/video.py line 37
|
|
87
|
+
|
|
88
|
+
- Default aspect for t2v CLI: 9:16 (PORTRAIT) — matches GenerateVideoRequest default
|
|
89
|
+
</decisions_made>
|
|
90
|
+
|
|
91
|
+
<blockers>
|
|
92
|
+
None. Plan is fully self-contained and executable.
|
|
93
|
+
</blockers>
|
|
94
|
+
|
|
95
|
+
<context>
|
|
96
|
+
Phase B of gflow-cli. Phase A shipped T2V transport (generate_video on
|
|
97
|
+
UiAutomationTransport) in v0.7.0 but generate_video never downloaded the mp4.
|
|
98
|
+
This plan adds the download primitive and wires the CLI.
|
|
99
|
+
|
|
100
|
+
Key files to understand:
|
|
101
|
+
- src/gflow_cli/api/video.py — VideoStatus, GenerateVideoRequest, Aspect.from_cli()
|
|
102
|
+
- src/gflow_cli/api/transports/ui_automation_video.py — VideoGenerationMixin, generate_video, _poll_video_status
|
|
103
|
+
- src/gflow_cli/api/routes.py — media_download_url(media_id) → getMediaUrlRedirect URL
|
|
104
|
+
- src/gflow_cli/api/client.py — download() at ~line 510 (already handles the redirect)
|
|
105
|
+
- src/gflow_cli/cli_video.py — all stubs, full replacement planned
|
|
106
|
+
- tmp/fetch_video.py — throwaway proof-of-concept for the download approach
|
|
107
|
+
|
|
108
|
+
After this plan, the remaining Phase B items are:
|
|
109
|
+
- I2V on UiAutomationTransport (Mode.I2V raises NotImplementedError)
|
|
110
|
+
- R2V on UiAutomationTransport (Mode.R2V raises NotImplementedError)
|
|
111
|
+
- T2V portrait live verification (one credit, one run)
|
|
112
|
+
- Listener-miss flake investigation
|
|
113
|
+
</context>
|
|
114
|
+
|
|
115
|
+
<next_action>
|
|
116
|
+
Read docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md then
|
|
117
|
+
invoke superpowers:subagent-driven-development to execute Task 1.
|
|
118
|
+
</next_action>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# PR #38 Review Tasks
|
|
2
|
+
|
|
3
|
+
- [x] Task 1: Worktree Initialization
|
|
4
|
+
- [x] Task 2: Compliance & Hygiene Check (FAILED DCO, found missing flag in _spawn_chrome)
|
|
5
|
+
- [x] Task 3: Functional Verification (Unit/Integration) (PASSED 680 tests)
|
|
6
|
+
- [x] Task 4: E2E Headless Validation (PASSED on Windows)
|
|
7
|
+
- [x] Task 5: Windows Regression Check (PASSED)
|
|
8
|
+
- [x] Task 6: Review Synthesis
|
|
@@ -7,6 +7,130 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.8.0] — 2026-05-23
|
|
11
|
+
|
|
12
|
+
> **Multi-image-prompt release + transport hardening.** Introduces the
|
|
13
|
+
> `gflow image batch` subcommand backed by a stay-mounted editor session,
|
|
14
|
+
> restores `gflow video t2v` with first-class auto-download, and ships the
|
|
15
|
+
> image/video mode-switch symmetry invariant that closes the historical
|
|
16
|
+
> "first-attempt listener-miss flake." Also clears all SonarCloud findings
|
|
17
|
+
> on the multi-image-prompt PR (cognitive-complexity refactors of
|
|
18
|
+
> `_set_count`, `parse_tsv_manifest`, and `_generate_images_batch_locked`).
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- `gflow image batch <manifest>` subcommand for batch image generation from
|
|
23
|
+
JSON or TSV manifests, with `--continue-on-error`. `MAX_BATCH_PROMPTS = 5`.
|
|
24
|
+
All prompts share one Flow project; jitter (3–7 s default) spaces the
|
|
25
|
+
submission clicks for anti-bot cadence, not completion wait. Closes
|
|
26
|
+
[#14](https://github.com/ffroliva/gflow-cli/issues/14) part 2.
|
|
27
|
+
- Application-layer structlog events for image-batch submission:
|
|
28
|
+
`image_batch.submission_attempt`, `image_batch.submission_result`,
|
|
29
|
+
`image_batch.row_completed`, `image_batch.inter_submission_latency_ms`.
|
|
30
|
+
Use these to debug Flow throttling regressions without re-instrumenting.
|
|
31
|
+
- `BatchPartialError` (in `errors`) — raised by fail-fast batch when
|
|
32
|
+
earlier prompts produced downloadable images before the failing one;
|
|
33
|
+
carries `partial_results` so the orchestrator can salvage them.
|
|
34
|
+
- `BatchIntegrityError` (in `errors`) — raised by the orchestrator when
|
|
35
|
+
post-download file count does not match the expected count.
|
|
36
|
+
- `BatchSubmissionResult` (in `api.dto`) — new transport-layer per-prompt
|
|
37
|
+
outcome with `project_id`, `prompt_idx`, `prompt_hash` fields. Public
|
|
38
|
+
`list[BatchOutcome]` orchestrator return is unchanged.
|
|
39
|
+
- `ui_automation.image_mode_entered` structlog event — emitted when the
|
|
40
|
+
editor is switched into Image mode. Companion to the existing
|
|
41
|
+
`ui_automation_video.video_mode_entered`.
|
|
42
|
+
- `ui_automation.orphaned_project_warning` structlog event — emitted when
|
|
43
|
+
`_enter_editor` succeeded but a later setup step
|
|
44
|
+
(`_dismiss_blocking_overlays` / `_switch_to_image_mode`) raises, so the
|
|
45
|
+
user can find their server-side project record.
|
|
46
|
+
- `ui_automation.batch_403_body` structlog event — emitted (warning level)
|
|
47
|
+
with a 200-char body prefix when a `batchGenerateImages` response is HTTP
|
|
48
|
+
403 (WAF / reCAPTCHA), immediately before the `WafRejectionError` raise.
|
|
49
|
+
- `VideoResult` dataclass — return type of `generate_video`, carries
|
|
50
|
+
`status` and `local_path` ([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
|
|
51
|
+
- `UiAutomationTransport._download_video` — downloads a generated mp4 via
|
|
52
|
+
`media.getMediaUrlRedirect` using the authenticated page; falls back to
|
|
53
|
+
`self._out_dir` then `tmp/` when no `out_dir` is supplied
|
|
54
|
+
([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
|
|
55
|
+
- `FlowApiClient.download_video(media_id, out_path)` — public API, mirrors
|
|
56
|
+
`download_image` ([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
|
|
57
|
+
- `gflow video t2v PROMPT` restored — generates and downloads a video
|
|
58
|
+
end-to-end on `UiAutomationTransport`; supports `--aspect`
|
|
59
|
+
(`9:16` / `16:9`), `--profile`, and `--out-dir`
|
|
60
|
+
([#29](https://github.com/ffroliva/gflow-cli/issues/29)).
|
|
61
|
+
- `UiAutomationTransport._switch_to_image_mode` static method + module-level
|
|
62
|
+
`IMAGE_TAB_IN_MENU_SELECTORS` cascade — mirror of the video side's
|
|
63
|
+
`_switch_to_video_mode`. Called from both `generate_images` and
|
|
64
|
+
`_generate_images_batch_locked` after `_dismiss_blocking_overlays`,
|
|
65
|
+
before `_configure_generation_settings`.
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
|
|
69
|
+
- `gflow image batch` editor session is now persistent across all prompts
|
|
70
|
+
in a batch. The transport's stay-mounted-session pattern is the
|
|
71
|
+
canonical shape; same-project semantics are the only supported mode.
|
|
72
|
+
- `_attach_batch_response_listener` now returns `(captured, detach_fn)`;
|
|
73
|
+
callers that used the single-list return need to unpack accordingly.
|
|
74
|
+
- `UiAutomationTransport.generate_video` now accepts `download: bool = True`
|
|
75
|
+
and returns `VideoResult` instead of `VideoStatus` — **breaking change
|
|
76
|
+
for direct transport callers** (the `FlowApiClient` boundary is
|
|
77
|
+
unaffected). Pass `download=False` to skip the auto-download step.
|
|
78
|
+
- `_set_count` (count-tab selector) is locale-invariant: regex
|
|
79
|
+
`^(1x|x[2-4])$` (Flow renders digit+x identically in every locale) +
|
|
80
|
+
positional `.nth(count - 1)` fallback when read-back text is
|
|
81
|
+
unrecognised. Partial fix for
|
|
82
|
+
[#24](https://github.com/ffroliva/gflow-cli/issues/24); `ONBOARDING_SELECTORS`
|
|
83
|
+
still localized text — see KNOWN_ISSUES.
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- `gflow image t2i` and `gflow image batch` now explicitly select Image
|
|
88
|
+
mode in the Flow editor before submitting. Previously, if the account
|
|
89
|
+
was last in Video mode, prompts were silently routed to the video
|
|
90
|
+
endpoint — no `batchGenerateImages` response was observed and the
|
|
91
|
+
listener timed out after 3 minutes. Also resolves the historical
|
|
92
|
+
"first-attempt listener-miss flake" recorded in `phase-b-followups`
|
|
93
|
+
memory item #1. Live-verified on profile `ffroliva` (1 t2i shot + full
|
|
94
|
+
batch e2e); evidence in
|
|
95
|
+
[`docs/LIVE_VERIFICATION_image_batch.md`](docs/LIVE_VERIFICATION_image_batch.md)
|
|
96
|
+
§ Post-mode-switch-fix verification.
|
|
97
|
+
- `gflow image batch` now actually shares one Flow project across all
|
|
98
|
+
prompts in a batch. Previously the `--same-project=1` flag was a no-op
|
|
99
|
+
at the `ui_automation` transport layer; each prompt landed in its own
|
|
100
|
+
Flow project. ([spec](docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md))
|
|
101
|
+
- `gflow image t2i -n N` now makes one transport call using Flow's native
|
|
102
|
+
xN count selector instead of fanning out N parallel single-image
|
|
103
|
+
submissions. Closes [#14](https://github.com/ffroliva/gflow-cli/issues/14) part 1.
|
|
104
|
+
- Structlog now uses `cache_logger_on_first_use=False` so per-test
|
|
105
|
+
`LogCapture` fixtures see events fired from production modules
|
|
106
|
+
(previously the cached logger froze the processor chain at import).
|
|
107
|
+
- All SonarCloud findings on the multi-image-prompt PR (S5655 / S5890 /
|
|
108
|
+
S1192 / S1172 / S3776 ×3) — see PR #40 commit `a0cb010` for the
|
|
109
|
+
cognitive-complexity refactors and the cast+pragma pattern for
|
|
110
|
+
`dataclasses.replace`.
|
|
111
|
+
|
|
112
|
+
### Removed
|
|
113
|
+
|
|
114
|
+
- **BREAKING:** `--same-project` flag on `gflow image batch`. The flag
|
|
115
|
+
collapsed to a single behaviour (always-same-project) — no toggle
|
|
116
|
+
remains. For different-project results, loop `gflow image t2i`
|
|
117
|
+
externally.
|
|
118
|
+
- **BREAKING:** `--seed` flag from `gflow image t2i` and `gflow image i2i`.
|
|
119
|
+
The flag was a no-op under the active UI transport since v0.7.0
|
|
120
|
+
(silently discarded inside the client before reaching the transport).
|
|
121
|
+
If reproducibility via user-controlled seed becomes possible again —
|
|
122
|
+
either through Flow UI exposing a seed control or via HTTP transport
|
|
123
|
+
revival — the surface will be re-introduced at that layer. The
|
|
124
|
+
wire-format body builder retains its `seed` / `batch_id` parameters for
|
|
125
|
+
the experimental HTTP transports' internal use.
|
|
126
|
+
- **BREAKING (library):** `FlowApiClient.generate_image` no longer accepts
|
|
127
|
+
`seed=` or `batch_id=` kwargs. `FlowApiClient.generate_images_batch` no
|
|
128
|
+
longer accepts `seeds=`. Callers passing these will get a `TypeError`.
|
|
129
|
+
Same justification as the CLI removal.
|
|
130
|
+
- **BREAKING (library):** `project_title` parameter removed from
|
|
131
|
+
`run_manifest_image_batch` — the transport now owns project creation
|
|
132
|
+
via `_enter_editor`, making this orchestrator-side knob dead weight.
|
|
133
|
+
|
|
10
134
|
## [0.7.0] — 2026-05-20
|
|
11
135
|
|
|
12
136
|
> **Downstream-worker ergonomics release.** Hardens `FlowApiClient` for
|
|
@@ -685,7 +809,8 @@ shell-script template that branches on these codes.
|
|
|
685
809
|
|
|
686
810
|
First skeleton. Not functional end-to-end yet.
|
|
687
811
|
|
|
688
|
-
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.
|
|
812
|
+
[Unreleased]: https://github.com/ffroliva/gflow-cli/compare/v0.8.0...HEAD
|
|
813
|
+
[0.8.0]: https://github.com/ffroliva/gflow-cli/compare/v0.7.0...v0.8.0
|
|
689
814
|
[0.7.0]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a6...v0.7.0
|
|
690
815
|
[0.6.0a6]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a5...v0.6.0a6
|
|
691
816
|
[0.6.0a5]: https://github.com/ffroliva/gflow-cli/compare/v0.6.0a4...v0.6.0a5
|
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
|
|
20
20
|
## Active phase
|
|
21
21
|
|
|
22
|
-
**
|
|
22
|
+
**v0.7.0 SHIPPED on PyPI (2026-05-20).** First stable (non-`aN`) release. Downstream-worker ergonomics release: `out_dir` plumbing, `health_check()`, optional `project_id`, `BrowserSessionClosedError` (#16 + #18); auth hardening (#15 + #17); overlay-dismiss (#26); 1:1 aspect-ratio cascade; signed-tag CI gate (#30); listener instrumentation. Image generation end-to-end live-verified on `ui_automation` across four aspect ratios (`9:16`, `16:9`, `1:1`, `4:3`) — see [`docs/LIVE_VERIFICATION_v0.7.0.md`](docs/LIVE_VERIFICATION_v0.7.0.md). The historical `aisandbox-pa` 401 is RESOLVED in v0.7.0 (KNOWN_ISSUES `## Resolved`).
|
|
23
23
|
|
|
24
|
-
**Active backlog → Phase B
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
24
|
+
**Active backlog → Phase B (video CLI).** Phase A (T2V transport, PR #23) shipped with v0.7.0. PR #36 (merged 2026-05-21) restored `gflow video t2v` with first-class video download ([#29](https://github.com/ffroliva/gflow-cli/issues/29) — CLOSED), `VideoResult`, and `FlowApiClient.download_video`; both `9:16` and `16:9` live-verified on profile `ffroliva` (see [`docs/LIVE_VERIFICATION_video_download.md`](docs/LIVE_VERIFICATION_video_download.md)). Remaining Phase B work:
|
|
25
|
+
- I2V (image-to-video) on `UiAutomationTransport` (`Mode.I2V` still raises `NotImplementedError`); then R2V
|
|
26
|
+
- Restore `gflow video i2v` and `gflow video batch` (currently stubbed with "not yet available")
|
|
27
|
+
- Parameterized live e2e under `tests/e2e/test_video_t2v_e2e.py` mirroring the image-side e2e
|
|
28
|
+
- v0.7.0 follow-ups still open: first-attempt listener-miss flake, signed-tag CI auto-signing (sigstore `gitsign`), and the `/gflow:release` doc bridge for the develop→main flow
|
|
29
29
|
|
|
30
30
|
Run `/gflow:plan` for the current detailed plan if a superpowers plan is active.
|
|
31
31
|
|