gflow-cli 0.6.0a6__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.6.0a6 → gflow_cli-0.8.0}/.claude/README.md +8 -3
- gflow_cli-0.8.0/.claude/commands/gflow/changelog.md +21 -0
- gflow_cli-0.8.0/.claude/commands/gflow/check.md +48 -0
- gflow_cli-0.8.0/.claude/commands/gflow/doc-review.md +137 -0
- gflow_cli-0.8.0/.claude/commands/gflow/known-issues.md +20 -0
- gflow_cli-0.8.0/.claude/commands/gflow/plan.md +39 -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.6.0a6 → gflow_cli-0.8.0}/.github/CODEOWNERS +1 -0
- gflow_cli-0.8.0/.github/PULL_REQUEST_TEMPLATE.md +20 -0
- gflow_cli-0.8.0/.github/copilot-instructions.md +24 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/workflows/ci.yml +16 -8
- gflow_cli-0.8.0/.github/workflows/external-pr-triage.yml +126 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/workflows/release.yml +18 -3
- {gflow_cli-0.6.0a6 → 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.6.0a6 → gflow_cli-0.8.0}/CHANGELOG.md +179 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CLAUDE.md +22 -18
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CONTRIBUTING.md +33 -5
- gflow_cli-0.8.0/KNOWN_ISSUES.md +425 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/PKG-INFO +41 -51
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/PLAN.md +85 -8
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/README.md +40 -50
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/RELEASE.md +2 -2
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/ARCHITECTURE.md +1 -0
- gflow_cli-0.8.0/docs/DEBUGGING.md +196 -0
- gflow_cli-0.8.0/docs/DEVELOPMENT.md +125 -0
- gflow_cli-0.8.0/docs/GITHUB.md +139 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/INDEX.md +31 -0
- gflow_cli-0.8.0/docs/LIVE_VERIFICATION_image_batch.md +355 -0
- gflow_cli-0.8.0/docs/LIVE_VERIFICATION_v0.7.0.md +110 -0
- gflow_cli-0.8.0/docs/LIVE_VERIFICATION_video_download.md +97 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/USAGE.md +123 -17
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/USER_GUIDE.md +87 -0
- gflow_cli-0.8.0/docs/superpowers/2026-05-17-issue-15-handover.md +59 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +463 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +1449 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +811 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +118 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +697 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +64 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +164 -0
- gflow_cli-0.8.0/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +2083 -0
- 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-17-e2e-test-coverage-design.md +190 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +330 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +485 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +87 -0
- gflow_cli-0.8.0/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +739 -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.6.0a6 → gflow_cli-0.8.0}/pyproject.toml +2 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/02_batchAsyncGenerateVideoText.json +3 -3
- gflow_cli-0.8.0/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +144 -0
- gflow_cli-0.8.0/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +136 -0
- gflow_cli-0.8.0/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +90 -0
- gflow_cli-0.8.0/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +97 -0
- gflow_cli-0.8.0/scripts/dev/active_plan.py +188 -0
- gflow_cli-0.8.0/scripts/dev/monitor_pr_38.py +37 -0
- gflow_cli-0.8.0/scripts/smoke_video_editor.py +874 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/__init__.py +1 -3
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/client.py +197 -183
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/dto.py +16 -62
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/recaptcha.py +1 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/base.py +2 -2
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/bearer.py +4 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +11 -2
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/sapisidhash.py +4 -1
- gflow_cli-0.8.0/src/gflow_cli/api/transports/ui_automation.py +1776 -0
- gflow_cli-0.8.0/src/gflow_cli/api/transports/ui_automation_video.py +543 -0
- gflow_cli-0.8.0/src/gflow_cli/api/video.py +168 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/internal_chromium.py +57 -23
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/real_chrome.py +62 -34
- gflow_cli-0.8.0/src/gflow_cli/auth/verification.py +229 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/browser_manager.py +1 -0
- {gflow_cli-0.6.0a6 → 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.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/errors.py +123 -4
- gflow_cli-0.8.0/src/gflow_cli/exceptions.py +25 -0
- gflow_cli-0.8.0/src/gflow_cli/image_batch.py +877 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/observability.py +1 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tasks/lessons.md +34 -0
- 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.6.0a6 → gflow_cli-0.8.0}/tests/api/test_client.py +102 -2
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_client_image.py +178 -224
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_dto.py +56 -36
- gflow_cli-0.8.0/tests/api/test_video.py +236 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_ui_automation.py +853 -4
- 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.8.0/tests/api/transports/test_ui_automation_video.py +452 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/auth/strategies/test_strategies.py +128 -50
- gflow_cli-0.8.0/tests/auth/test_verification.py +301 -0
- {gflow_cli-0.6.0a6 → 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.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_error_handling.py +17 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_t2i_multi_prompt.py +0 -9
- gflow_cli-0.8.0/tests/e2e/conftest.py +67 -0
- gflow_cli-0.8.0/tests/e2e/test_auth_verification_e2e.py +65 -0
- gflow_cli-0.8.0/tests/e2e/test_image_batch_e2e.py +205 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/e2e/test_transports_e2e.py +72 -0
- gflow_cli-0.8.0/tests/e2e/test_video_t2v_e2e.py +139 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/conftest.py +0 -2
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_image_steps.py +0 -1
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_step_collision_guard.py +2 -4
- 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.6.0a6 → gflow_cli-0.8.0}/tests/test_errors.py +66 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/uv.lock +89 -0
- gflow_cli-0.6.0a6/.claude/commands/release.md +0 -97
- gflow_cli-0.6.0a6/KNOWN_ISSUES.md +0 -198
- gflow_cli-0.6.0a6/scripts/smoke_e2e.py +0 -78
- gflow_cli-0.6.0a6/src/gflow_cli/api/transports/ui_automation.py +0 -871
- gflow_cli-0.6.0a6/src/gflow_cli/api/video.py +0 -112
- gflow_cli-0.6.0a6/src/gflow_cli/cli_video.py +0 -341
- gflow_cli-0.6.0a6/src/gflow_cli/image_batch.py +0 -442
- gflow_cli-0.6.0a6/tests/api/test_client_generate_video.py +0 -93
- gflow_cli-0.6.0a6/tests/api/test_video.py +0 -83
- gflow_cli-0.6.0a6/tests/features/test_video_steps.py +0 -253
- gflow_cli-0.6.0a6/tests/features/video.feature +0 -27
- gflow_cli-0.6.0a6/tests/test_cli_video.py +0 -220
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.env.template +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.gitattributes +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.github/dependabot.yml +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.gitleaks.toml +0 -0
- {gflow_cli-0.6.0a6 → 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.6.0a6 → gflow_cli-0.8.0}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/.secrets.baseline +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/CONFIGURATION.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/DISCLAIMER.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/LICENSE +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/SECURITY.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
- {gflow_cli-0.6.0a6 → 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.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_SEC_UX.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY_FOLLOWUP.md +0 -0
- {gflow_cli-0.6.0a6 → 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.6.0a6 → 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.6.0a6 → 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.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/README.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/sample_config.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/README.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/diag_capture_flow_traffic.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/diag_recaptcha_mint.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/skills/README.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/sonar-project.properties +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_image.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/conftest.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/auth.feature +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/image.feature +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.6.0a6/tests/smoke → gflow_cli-0.8.0/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_auth.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_config.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_manifest.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_observability.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_paths.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.6.0a6 → gflow_cli-0.8.0}/tests/test_smoke.py +0 -0
|
@@ -10,7 +10,12 @@ This directory holds **internal maintainer workflows** that are bundled with the
|
|
|
10
10
|
.claude/
|
|
11
11
|
├── README.md ← this file
|
|
12
12
|
└── commands/ ← repo-local slash commands
|
|
13
|
-
└──
|
|
13
|
+
└── gflow/ ← `/gflow:*` namespace (avoids collision with built-ins)
|
|
14
|
+
├── check.md ← `/gflow:check` — hygiene + ruff + pyright + pytest
|
|
15
|
+
├── plan.md ← `/gflow:plan` — show active phase / superpowers plan
|
|
16
|
+
├── known-issues.md← `/gflow:known-issues` — open/mitigated items
|
|
17
|
+
├── changelog.md ← `/gflow:changelog` — [Unreleased] + last tagged
|
|
18
|
+
└── release.md ← `/gflow:release` — full release flow (signed tags)
|
|
14
19
|
```
|
|
15
20
|
|
|
16
21
|
Optional additions when needed:
|
|
@@ -25,9 +30,9 @@ Optional additions when needed:
|
|
|
25
30
|
|
|
26
31
|
## Adding a slash command
|
|
27
32
|
|
|
28
|
-
Drop a Markdown file into `commands
|
|
33
|
+
Drop a Markdown file into `commands/gflow/` to add a `/gflow:<name>` command. Filename (without `.md`) becomes the command name. The first paragraph is the description Claude shows in `/help`. The rest is the prompt the agent executes. **Use the `gflow/` subdirectory** so commands stay namespaced and don't collide with Claude Code built-ins or user-global commands.
|
|
29
34
|
|
|
30
|
-
Example: `commands/foo.md` → invoked as `/foo`.
|
|
35
|
+
Example: `commands/gflow/foo.md` → invoked as `/gflow:foo`.
|
|
31
36
|
|
|
32
37
|
## Adding an internal skill
|
|
33
38
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show unreleased changes and last tagged version — insight into recent work.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:changelog` — Recent changes
|
|
6
|
+
|
|
7
|
+
Read CHANGELOG.md and surface what's queued and what recently shipped.
|
|
8
|
+
|
|
9
|
+
## Steps
|
|
10
|
+
|
|
11
|
+
1. Read [CHANGELOG.md](../../../CHANGELOG.md)
|
|
12
|
+
2. Return:
|
|
13
|
+
- All entries under `## [Unreleased]` (empty = nothing queued yet)
|
|
14
|
+
- The most recent versioned section (last tagged release) for comparison
|
|
15
|
+
3. One-line summary: "X features, Y fixes queued since vZ."
|
|
16
|
+
|
|
17
|
+
## When to call
|
|
18
|
+
|
|
19
|
+
- Before cutting a release (called automatically by `/gflow:release` as its first step)
|
|
20
|
+
- When you need a quick picture of recent work without opening the file
|
|
21
|
+
- When writing a commit message and unsure if a change is user-visible enough to log
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Auto-fix lint and formatting, then report types and tests. Run before every commit.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:check` — Quality gates
|
|
6
|
+
|
|
7
|
+
Run in order. Stop and report if a step fails after the fix pass.
|
|
8
|
+
|
|
9
|
+
## Steps
|
|
10
|
+
|
|
11
|
+
**1. Repo hygiene** (read-only — checks tmp/ output rule, secret files, etc.)
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
PYTHONUTF8=1 uv run python scripts/ci/check_repo_hygiene.py
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**2. Auto-fix lint and formatting** (rewrites files in place)
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
uv run ruff check --fix src tests
|
|
21
|
+
uv run ruff format src tests
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Report which files were modified. Do NOT stage or commit — leave the diff for review.
|
|
25
|
+
|
|
26
|
+
**3. Type check** (report only — cannot auto-fix)
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
uv run pyright src
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**4. Tests + coverage** (report only)
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
uv run pytest -q --cov=gflow_cli --cov-fail-under=80
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Output
|
|
39
|
+
|
|
40
|
+
- List files changed by the fix pass (empty = nothing needed fixing)
|
|
41
|
+
- All pyright errors with `file:line` references
|
|
42
|
+
- Pytest summary line and coverage percentage
|
|
43
|
+
- Final verdict: all gates pass / which gates failed
|
|
44
|
+
|
|
45
|
+
## Notes
|
|
46
|
+
|
|
47
|
+
Ruff fix and format may rewrite multiple files. Always `git diff` before staging.
|
|
48
|
+
Pyright errors and test failures require manual intervention — do not attempt silent workarounds.
|
|
@@ -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,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Surface open known issues. Call before touching auth, reCAPTCHA, or anything previously flagged.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:known-issues` — Open issues
|
|
6
|
+
|
|
7
|
+
Read KNOWN_ISSUES.md and return items that are still open or mitigated (not resolved).
|
|
8
|
+
|
|
9
|
+
## Steps
|
|
10
|
+
|
|
11
|
+
1. Read [KNOWN_ISSUES.md](../../../KNOWN_ISSUES.md)
|
|
12
|
+
2. Return only items with status **open** or **mitigated**
|
|
13
|
+
3. Flag any that are relevant to the current task context
|
|
14
|
+
|
|
15
|
+
## When to call
|
|
16
|
+
|
|
17
|
+
- Before touching `src/gflow_cli/auth.py`
|
|
18
|
+
- Before touching `src/gflow_cli/api/recaptcha.py`
|
|
19
|
+
- Before any work the user flags as "this felt flaky before"
|
|
20
|
+
- When a test or behaviour feels unexpectedly broken
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Show the active plan — next task if a superpowers plan is running, current phase otherwise.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:plan` — Active plan
|
|
6
|
+
|
|
7
|
+
## Steps
|
|
8
|
+
|
|
9
|
+
**1. Check conversation context.**
|
|
10
|
+
|
|
11
|
+
Has the user mentioned a specific feature or invoked the write-plan skill in this session?
|
|
12
|
+
If yes, note the feature name (e.g. `shell-multi-prompt`, `image-mvp`, `phase-4-hardening`).
|
|
13
|
+
|
|
14
|
+
**2. Run the discovery script.**
|
|
15
|
+
|
|
16
|
+
With a feature name identified in step 1:
|
|
17
|
+
```bash
|
|
18
|
+
uv run python scripts/dev/active_plan.py --feature <feature-name>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Without a feature name (uses most-recent superpowers plan, falls back to PLAN.md):
|
|
22
|
+
```bash
|
|
23
|
+
uv run python scripts/dev/active_plan.py
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**3. Return the output verbatim.**
|
|
27
|
+
|
|
28
|
+
The script already filters to the relevant block. Do not read additional files.
|
|
29
|
+
|
|
30
|
+
## What the script returns
|
|
31
|
+
|
|
32
|
+
- **Superpowers plan active:** file path, title, goal, progress (X/N steps), and the next unchecked task block
|
|
33
|
+
- **No superpowers plan:** the first incomplete phase from `PLAN.md` (scope, sequence, definition of done)
|
|
34
|
+
|
|
35
|
+
## When to call
|
|
36
|
+
|
|
37
|
+
- When starting a task and unsure what's in scope
|
|
38
|
+
- When the user asks "what are we working on?" or "what's next?"
|
|
39
|
+
- Before adding a feature, to check it belongs to the current scope
|
|
@@ -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,20 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What changed and why? Link issues with "Fixes #123" when applicable. -->
|
|
4
|
+
|
|
5
|
+
## Validation
|
|
6
|
+
|
|
7
|
+
<!-- List the focused commands you ran, plus any checks you could not run. -->
|
|
8
|
+
|
|
9
|
+
- [ ] Focused tests added or updated for behavior changes
|
|
10
|
+
- [ ] `uv run ruff check src tests`
|
|
11
|
+
- [ ] `uv run pyright src`
|
|
12
|
+
- [ ] Relevant pytest command:
|
|
13
|
+
|
|
14
|
+
## Contribution Checklist
|
|
15
|
+
|
|
16
|
+
- [ ] This PR targets `develop`, unless it is a release or emergency fix
|
|
17
|
+
- [ ] My commits use my real Git identity or GitHub noreply email
|
|
18
|
+
- [ ] External contribution commits include `Signed-off-by:` (`git commit -s`)
|
|
19
|
+
- [ ] I did not include secrets, cookies, account tokens, signed URLs, or private captured data
|
|
20
|
+
- [ ] I reviewed any AI-assisted changes before submitting
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Copilot Code Review Instructions
|
|
2
|
+
|
|
3
|
+
Review this repository as a Python CLI that automates browser-authenticated
|
|
4
|
+
Google Flow workflows. Treat auth, browser automation, CI, release, and secret
|
|
5
|
+
handling changes as high-risk even when the diff is small.
|
|
6
|
+
|
|
7
|
+
For pull request reviews:
|
|
8
|
+
|
|
9
|
+
- Check that PRs target `develop`, unless they are release PRs.
|
|
10
|
+
- Flag unclear contributor provenance, missing DCO sign-off, placeholder author
|
|
11
|
+
emails, and any copied private data.
|
|
12
|
+
- Look for leaked tokens, cookies, signed URLs, local profile paths, and captured
|
|
13
|
+
Google/Flow request data.
|
|
14
|
+
- For auth/browser changes, check that the implementation preserves profile
|
|
15
|
+
isolation, does not weaken local path boundaries, and avoids remote debugging
|
|
16
|
+
unless explicitly documented.
|
|
17
|
+
- For CI changes, check forked-PR secret behavior and avoid recommending
|
|
18
|
+
`pull_request_target` for jobs that checkout or execute contributor code.
|
|
19
|
+
- For behavior changes, expect focused tests and docs/changelog updates.
|
|
20
|
+
- Keep findings concrete: reference files/lines, explain the user-visible risk,
|
|
21
|
+
and separate blocking issues from cosmetic suggestions.
|
|
22
|
+
|
|
23
|
+
Do not approve pull requests. Copilot review is advisory; maintainer approval is
|
|
24
|
+
still required.
|