gflow-cli 0.7.0__tar.gz → 0.8.1__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.1/.claude/commands/gflow/doc-review.md +259 -0
- gflow_cli-0.8.1/.claude/commands/gflow/release.md +168 -0
- gflow_cli-0.8.1/.continue-here.md +118 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.gitignore +3 -0
- gflow_cli-0.8.1/.planning/todos/pending/pr-38-review.md +8 -0
- gflow_cli-0.8.1/AGENTS.md +78 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/CHANGELOG.md +143 -1
- gflow_cli-0.8.1/CLAUDE.md +27 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/KNOWN_ISSUES.md +101 -2
- gflow_cli-0.8.1/PKG-INFO +170 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/PLAN.md +45 -8
- gflow_cli-0.8.1/README.md +116 -0
- gflow_cli-0.8.1/docs/AGENT_GUIDE.md +33 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/ARCHITECTURE.md +88 -4
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/DEBUGGING.md +16 -3
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/INDEX.md +9 -3
- gflow_cli-0.8.1/docs/LIVE_VERIFICATION_image_batch.md +355 -0
- gflow_cli-0.8.1/docs/LIVE_VERIFICATION_v0.8.1.md +46 -0
- gflow_cli-0.8.1/docs/LIVE_VERIFICATION_video_download.md +97 -0
- gflow_cli-0.8.1/docs/PROJECT_STATUS.md +47 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/USAGE.md +59 -7
- gflow_cli-0.8.1/docs/superpowers/plans/2026-05-20-video-download-t2v-cli.md +784 -0
- gflow_cli-0.8.1/docs/superpowers/plans/2026-05-21-multi-image-prompt-orchestration.md +632 -0
- gflow_cli-0.8.1/docs/superpowers/plans/2026-05-21-multi-image-prompt.md +2410 -0
- gflow_cli-0.8.1/docs/superpowers/plans/2026-05-22-pr-38-review.md +107 -0
- gflow_cli-0.8.1/docs/superpowers/plans/2026-05-22-stay-mounted-batch-session-plan.md +1907 -0
- gflow_cli-0.8.1/docs/superpowers/specs/2026-05-21-multi-image-prompt-design.md +457 -0
- gflow_cli-0.8.1/docs/superpowers/specs/2026-05-22-pr-38-review-design.md +40 -0
- gflow_cli-0.8.1/docs/superpowers/specs/2026-05-22-stay-mounted-batch-session-design.md +389 -0
- gflow_cli-0.8.1/llms.txt +28 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/pyproject.toml +2 -1
- gflow_cli-0.8.1/scripts/ci/check_doc_links.py +82 -0
- gflow_cli-0.8.1/scripts/dev/monitor_pr_38.py +37 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/__init__.py +1 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/client.py +65 -91
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/dto.py +22 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/experimental/bearer.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/experimental/evaluate_fetch.py +4 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/experimental/sapisidhash.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/ui_automation.py +759 -35
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/ui_automation_video.py +51 -6
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/video.py +12 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/internal_chromium.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/real_chrome.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/verification.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/browser_manager.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/cli_image.py +146 -52
- gflow_cli-0.8.1/src/gflow_cli/cli_video.py +153 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/errors.py +65 -0
- gflow_cli-0.8.1/src/gflow_cli/image_batch.py +877 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/observability.py +1 -1
- gflow_cli-0.8.1/test_assets/sample_batch.json +5 -0
- gflow_cli-0.8.1/test_assets/sample_batch.tsv +3 -0
- gflow_cli-0.8.1/test_assets/sample_batch_invalid.tsv +4 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_client.py +16 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_client_image.py +67 -164
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_dto.py +57 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_video.py +23 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_ui_automation.py +611 -0
- gflow_cli-0.8.1/tests/api/transports/test_ui_automation_batch.py +1169 -0
- gflow_cli-0.8.1/tests/api/transports/test_ui_automation_image_mode.py +177 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_ui_automation_video.py +61 -1
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/auth/strategies/test_strategies.py +1 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/cli/test_cli_image.py +57 -13
- gflow_cli-0.8.1/tests/cli/test_cli_image_seed_removed.py +31 -0
- gflow_cli-0.8.1/tests/cli/test_cli_video.py +68 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/cli/test_t2i_multi_prompt.py +0 -9
- gflow_cli-0.8.1/tests/e2e/test_image_batch_e2e.py +205 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/test_image_steps.py +0 -1
- gflow_cli-0.8.1/tests/image_batch/test_image_manifest.py +384 -0
- gflow_cli-0.8.1/tests/image_batch/test_observability_events.py +185 -0
- gflow_cli-0.8.1/tests/smoke/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_errors.py +38 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/uv.lock +90 -1
- gflow_cli-0.7.0/.claude/commands/gflow/release.md +0 -118
- gflow_cli-0.7.0/CLAUDE.md +0 -219
- gflow_cli-0.7.0/PKG-INFO +0 -441
- gflow_cli-0.7.0/README.md +0 -387
- 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.1}/.claude/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.claude/commands/gflow/changelog.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.claude/commands/gflow/check.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.claude/commands/gflow/known-issues.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.claude/commands/gflow/plan.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.env.template +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.gitattributes +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/CODEOWNERS +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/copilot-instructions.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/dependabot.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/workflows/ci.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/workflows/external-pr-triage.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.github/workflows/release.yml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.gitleaks.toml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.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.1}/.pre-commit-config.yaml +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/.secrets.baseline +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/CONFIGURATION.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/CONTRIBUTING.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/DISCLAIMER.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/LICENSE +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/RELEASE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/AUTHENTICATION.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/CONFIGURATION.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/DEVELOPMENT.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/GITHUB.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/LIVE_VERIFICATION_v0.7.0.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/USER_GUIDE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/assets/example-run.gif +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/2026-05-17-issue-15-handover.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-09-image-mvp-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-09-image-mvp.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-09-video-mvp-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-09-video-mvp.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-10-phase-4-hardening-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-10-phase-4-hardening.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/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.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_FINAL_ARCH.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/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.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_CODE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_GEMINI.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/COUNCIL_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_PYTHON.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/IMPLEMENTATION_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_CODE.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_FOLLOWUP.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_PLANNER.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-14-shell-multi-prompt/PLAN_REVIEW_SECURITY.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/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.1}/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.1}/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.1}/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.1}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/PLAN.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-15-auth-login-real-chrome/orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-17-e2e-test-coverage.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-17-issue-15-auth-verification-fix.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-17-issue-15-i2v-bearer-auth.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-17-issue-15-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-18-video-phase0-submit-spike.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-19-video-phase-a-execution-state.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-19-video-phase-a-orchestration.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/plans/2026-05-19-video-phase-a-t2v.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-10-phase-4-hardening-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-14-shell-multi-prompt-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-15-auth-login-real-chrome-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-17-e2e-test-coverage-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-17-i2v-uploadimage-401-bearer-auth-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-17-issue-15-auth-verification-fix-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-17-issue-15-root-cause-findings.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/specs/2026-05-18-ui-automation-video-generation-design.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/docs/superpowers/verifications/2026-05-11-phase-4-stage-g.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/examples/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/examples/batch_from_config.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/examples/multi_prompt_t2i.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/examples/sample_config.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/examples/sample_prompts.txt +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/examples/single_image_t2i.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/01_upload_image.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/02_batchAsyncGenerateVideoText.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/03_batchCheckAsyncVideoGenerationStatus.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/04_archive_workflow.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/05_createProject.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/06_batchGenerateImages.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/07_batchGenerateImages_seeded.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/08_batchAsyncGenerateVideoStartAndEndImage.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/09_batchAsyncGenerateVideoReferenceImages.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/10_batchCheckAsyncVideoGenerationStatus_successful.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/samples/captured/11_batchCheckAsyncVideoGenerationStatus_failed.json +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/ci/check_repo_hygiene.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/debug_editor.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/debug_gen_settings.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/debug_settings.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/dev/active_plan.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/diag_capture_flow_traffic.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/diag_recaptcha_mint.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/record_demo.ps1 +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/smoke_image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/smoke_real_chrome_image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/smoke_video_editor.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/smoke_worker_style.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/scripts/verify_chrome_auth_viability.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/skills/README.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/skills/gflow-cli/SKILL.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/sonar-project.properties +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/__main__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/_cli_helpers.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/_retry.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/recaptcha.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/routes.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/_common.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/_fingerprint.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/base.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/api/transports/experimental/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/base.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/factory.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/auth/strategies.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/cli.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/cli_run.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/config.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/exceptions.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/manifest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/paths.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/src/gflow_cli/profile_store.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tasks/lessons.md +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_concurrency.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_image.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_image_dto.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_recaptcha.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_retry.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/test_routes.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_base.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_bearer.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_common.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_evaluate_fetch.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_factory.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_fingerprint.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/api/transports/test_sapisidhash.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/auth/strategies/test_factory.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/auth/test_verification.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/cli/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/cli/test_cli_run.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/cli/test_error_handling.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/cli/test_helpers.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/conftest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/e2e/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/e2e/conftest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/e2e/test_auth_verification_e2e.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/e2e/test_transports_e2e.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/e2e/test_video_t2v_e2e.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/auth.feature +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/auth_login.feature +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/conftest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/image.feature +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/test_auth_login_steps.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/test_auth_steps.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/features/test_step_collision_guard.py +0 -0
- {gflow_cli-0.7.0/tests/smoke → gflow_cli-0.8.1/tests/image_batch}/__init__.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/smoke/test_real_flow.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_auth.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_browser_manager.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_config.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_manifest.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_observability.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_paths.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_profile_store.py +0 -0
- {gflow_cli-0.7.0 → gflow_cli-0.8.1}/tests/test_smoke.py +0 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Use before cutting any gflow-cli release or after a major documentation change — systematic council-driven audit that combines a mechanical 7-section checklist with a 3-agent parallel review (completeness / cross-reference / drift). Produces a consensus verdict and a concrete fix list.
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# `/gflow:doc-review` — Documentation Review Gate
|
|
6
|
+
|
|
7
|
+
Run this gate before cutting a release. Two phases:
|
|
8
|
+
|
|
9
|
+
1. **Mechanical checks** (sections 1–7 below) — fast, scripted, deterministic. Run inline.
|
|
10
|
+
2. **LLM council audit** (section 8) — 3 parallel review subagents, then consensus synthesis. The mechanical pass catches stale strings and dead links; the council catches drift between docs, fictional claims, and gaps a human reader would notice.
|
|
11
|
+
|
|
12
|
+
Every item reports **PASS / UPDATED / WARN / FAIL**. Any **FAIL** or any **RED** council verdict blocks the release.
|
|
13
|
+
|
|
14
|
+
> **Provenance:** the council protocol below was validated on the v0.8.1 docs refresh release (2026-05-23). The audit found 11 fixable issues that the mechanical checklist alone missed (e.g., the `experimental/` subpackage fiction in 3 files, the `gflow video i2v` non-working hero snippet in README). Keep the council step — it pays for itself.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 0 · Pre-flight
|
|
19
|
+
|
|
20
|
+
- Confirm you are on the release branch (`release/vX.Y.Z` or `hotfix/...`), not on `develop` or `main`.
|
|
21
|
+
- If a release spec exists at `docs/superpowers/specs/YYYY-MM-DD-*-design.md`, identify it now — the council auditors will use it as the ground truth for "what was supposed to ship."
|
|
22
|
+
- If there is no spec, that is also fine — the council will work from the docs alone, but flag the absence as a process risk.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 1 · Version references
|
|
27
|
+
|
|
28
|
+
Check these files for stale version strings (old numbers, outdated status labels):
|
|
29
|
+
|
|
30
|
+
| File | What to verify |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `README.md` | Status badge, "Project status" section, install example |
|
|
33
|
+
| `AGENTS.md` | Module list, exit-code range, dev-environment commands |
|
|
34
|
+
| `llms.txt` | Header summary (Python version, stable surface claims) |
|
|
35
|
+
| `CLAUDE.md` | "Active phase" pointer if present |
|
|
36
|
+
| `PLAN.md` | Phase status (`IN PROGRESS` / `DONE`) and version annotations |
|
|
37
|
+
| `KNOWN_ISSUES.md` | `Open` entries resolved by this release → move to `Resolved` with evidence |
|
|
38
|
+
| `CHANGELOG.md` | `[Unreleased]` empty; link footer matches new version |
|
|
39
|
+
| `pyproject.toml` + `src/gflow_cli/__init__.py` | Both set to the new version |
|
|
40
|
+
| `docs/PROJECT_STATUS.md` | "Current release" subsection + milestone-history row for this version |
|
|
41
|
+
|
|
42
|
+
Quick grep:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
grep -rn "v[0-9]\+\.[0-9]" README.md AGENTS.md llms.txt CLAUDE.md PLAN.md KNOWN_ISSUES.md CHANGELOG.md pyproject.toml docs/PROJECT_STATUS.md
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Historical references in `CHANGELOG.md`, `docs/LIVE_VERIFICATION_v*.md`, and milestone-history rows in `docs/PROJECT_STATUS.md` are allowed.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 2 · `docs/INDEX.md` completeness
|
|
53
|
+
|
|
54
|
+
Every `.md` in `docs/` needs an entry; every entry must point to a real file. AGENTS.md and llms.txt also need rows since they are agent-facing entry points.
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# Files in docs/ missing from INDEX.md
|
|
58
|
+
for f in docs/*.md; do
|
|
59
|
+
grep -q "$(basename "$f")" docs/INDEX.md || echo "MISSING from INDEX: $f"
|
|
60
|
+
done
|
|
61
|
+
|
|
62
|
+
# Entries in INDEX.md pointing to deleted files
|
|
63
|
+
grep -o 'docs/[^)]*\.md' docs/INDEX.md | while read path; do
|
|
64
|
+
[ -f "$path" ] || echo "DEAD LINK in INDEX: $path"
|
|
65
|
+
done
|
|
66
|
+
|
|
67
|
+
# AGENTS.md, llms.txt rows present?
|
|
68
|
+
grep -E "AGENTS\.md|llms\.txt" docs/INDEX.md || echo "MISSING: agent-facing root files row"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 3 · Per-release evidence file
|
|
74
|
+
|
|
75
|
+
After each release a `docs/LIVE_VERIFICATION_vX.Y.Z.md` must exist.
|
|
76
|
+
|
|
77
|
+
- Latest version has one (create stub if live run already documented elsewhere).
|
|
78
|
+
- `docs/INDEX.md` "latest release" cue points to it.
|
|
79
|
+
- Previous versions' files are preserved (historical record — never delete).
|
|
80
|
+
- File contains both a **Pre-tag gates** section (filled before signing) and a **Post-tag evidence** section (filled after publish).
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 4 · Doc-link validation
|
|
85
|
+
|
|
86
|
+
Run the link checker:
|
|
87
|
+
|
|
88
|
+
```powershell
|
|
89
|
+
$env:PYTHONUTF8=1
|
|
90
|
+
uv run python scripts/ci/check_doc_links.py
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Expected: `All links resolved across N files.` (exit 0). Broken links must be fixed in source docs before continuing — do not edit the script to ignore them.
|
|
94
|
+
|
|
95
|
+
If `scripts/ci/check_doc_links.py` is absent, create it from the v0.8.1 plan (it is a 30-line stdlib-only Python script).
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 5 · `.claude/commands/gflow/` skill files
|
|
100
|
+
|
|
101
|
+
Scan all skills for stale phase/version references:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
grep -rn "v[0-9]\+\.[0-9]\|Phase [A-Z0-9]" .claude/commands/gflow/
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Update in the release prep commit if any references are wrong. The `release.md` skill's step list and the `plan.md` skill's phase pointers age fastest.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 6 · CHANGELOG link footer
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
tail -10 CHANGELOG.md
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Must read: `[Unreleased]: …compare/vNEW_VERSION…HEAD` and each prior `[X.Y.Z]: …compare/vPREV…vCURR`.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 7 · Memory files
|
|
122
|
+
|
|
123
|
+
Check `C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory\`:
|
|
124
|
+
|
|
125
|
+
| File | What to verify |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `MEMORY.md` | All listed files exist; no dangling entries |
|
|
128
|
+
| `phase-b-followups.md` | Items shipped in this release marked done |
|
|
129
|
+
| `video-generation-spec.md` | PR/status accurate |
|
|
130
|
+
| `image-generation-401-next.md` | Resolution status and evidence pointer still valid |
|
|
131
|
+
| `release-signing.md` | Procedure section matches what was actually done |
|
|
132
|
+
| `release-back-merge-gap-recovery.md` | Still relevant; gap from any prior release recorded |
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
cd "C:\Users\ffrol\.claude\projects\C--development-github-gflow-cli\memory"
|
|
136
|
+
grep -o '\[.*\]([^)]*\.md)' MEMORY.md | grep -o '([^)]*)' | tr -d '()' | while read f; do
|
|
137
|
+
[ -f "$f" ] || echo "DEAD LINK: $f"
|
|
138
|
+
done
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 8 · LLM council audit (NEW — required for every release ≥ v0.8.1)
|
|
144
|
+
|
|
145
|
+
The mechanical checks above catch stale strings, dead links, and missing files. They do **not** catch:
|
|
146
|
+
|
|
147
|
+
- A doc claiming a subpackage exists when it does not (no string sweep would notice).
|
|
148
|
+
- Two docs covering the same topic with subtly different facts.
|
|
149
|
+
- A working-looking hero snippet that points to a stub command (`gflow video i2v` returned "not yet available" but appeared as a production loop above the fold in v0.8.1).
|
|
150
|
+
- A user-facing onboarding gap that a fresh reader would hit immediately.
|
|
151
|
+
|
|
152
|
+
The council does. Dispatch three review subagents **in parallel** (they are read-only and independent). Each writes its verdict to `tmp/council/`.
|
|
153
|
+
|
|
154
|
+
### Setup
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
mkdir -p tmp/council
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Auditor 1 — Completeness
|
|
161
|
+
|
|
162
|
+
Role: as a fresh user / fresh AI agent, **what do you need that isn't there?**
|
|
163
|
+
|
|
164
|
+
Audit:
|
|
165
|
+
- `README.md`, `AGENTS.md`, `llms.txt`, `CLAUDE.md`, `docs/INDEX.md`, `docs/PROJECT_STATUS.md`
|
|
166
|
+
- `docs/ARCHITECTURE.md` (especially any new sections)
|
|
167
|
+
- `docs/LIVE_VERIFICATION_v*.md` (latest)
|
|
168
|
+
- `CHANGELOG.md` (just the new entry)
|
|
169
|
+
- `pyproject.toml`
|
|
170
|
+
- The release spec at `docs/superpowers/specs/` (if present)
|
|
171
|
+
- The implementation plan at `docs/superpowers/plans/` (if present)
|
|
172
|
+
|
|
173
|
+
Output to `tmp/council/01-completeness.md` with verdict GREEN / YELLOW / RED and four sections:
|
|
174
|
+
1. Critical gaps (block release)
|
|
175
|
+
2. Important gaps (fix before next release)
|
|
176
|
+
3. Nice-to-haves (track for next version)
|
|
177
|
+
4. What's done well (preserve)
|
|
178
|
+
|
|
179
|
+
### Auditor 2 — Cross-reference & alignment
|
|
180
|
+
|
|
181
|
+
Role: do the docs **agree with each other**? Where two files cover the same topic, do they say the same thing?
|
|
182
|
+
|
|
183
|
+
Check:
|
|
184
|
+
- Install instructions, auth flow, headed-browser story, version number, Python requirement — all match exactly?
|
|
185
|
+
- Internal `[X](path)` links — files exist AND claims at the link target equivalent to the linking-doc's claim?
|
|
186
|
+
- Routing chain (README → AGENTS.md → CLAUDE.md → docs/INDEX.md) — consistent? Any contradictions?
|
|
187
|
+
- CHANGELOG vs PROJECT_STATUS — milestone history matches changelog entries?
|
|
188
|
+
- Spec vs implementation — does the shipped state match the design spec?
|
|
189
|
+
|
|
190
|
+
Output to `tmp/council/02-crossref.md` with verdict + four sections (inconsistencies / drift / broken anchors / well-aligned).
|
|
191
|
+
|
|
192
|
+
### Auditor 3 — Drift & staleness
|
|
193
|
+
|
|
194
|
+
Role: does the documentation match the actual code and project state? **Where are claims unverifiable, contradicted by reality, or referencing things that no longer exist?**
|
|
195
|
+
|
|
196
|
+
Check empirically (every claim needs `ls` / `grep` / `cat` evidence cited inline):
|
|
197
|
+
- Version claims — `pyproject.toml`, `__init__.py`, every "v0.8.1 — alpha" statement agree?
|
|
198
|
+
- Module / file claims — every `src/gflow_cli/{...}` module list verified against the actual source tree?
|
|
199
|
+
- Subpackage claims (e.g., `experimental/`) — do those directories exist?
|
|
200
|
+
- CLI command claims in hero snippets — is the subcommand really implemented? Does it actually do what the example shows, or is it a stub?
|
|
201
|
+
- Exit-code claims — verify the range against `errors.py::EXIT_CODE_MAP`.
|
|
202
|
+
- Skill files, GIF assets, slash-command files — exist at the paths claimed?
|
|
203
|
+
|
|
204
|
+
Output to `tmp/council/03-drift.md` with verdict + three sections (fictional claims / stale references / verified-real).
|
|
205
|
+
|
|
206
|
+
### Consensus
|
|
207
|
+
|
|
208
|
+
After all three reports return:
|
|
209
|
+
|
|
210
|
+
1. Read all three. List every distinct finding.
|
|
211
|
+
2. Tier the findings:
|
|
212
|
+
- **Tier 1 (release-blocking)** — any RED verdict, any "block release" finding, any fictional claim that ships to PyPI.
|
|
213
|
+
- **Tier 2 (important polish)** — drift between related docs, minor mismatches, missing-but-recoverable references.
|
|
214
|
+
- **Tier 3 (track for later)** — nice-to-haves, prose improvements, deferred features.
|
|
215
|
+
3. Apply Tier 1 fixes immediately (block the release until done).
|
|
216
|
+
4. Apply Tier 2 fixes if the release schedule permits, otherwise open issues.
|
|
217
|
+
5. Tier 3 → backlog (memory `phase-X-followups.md` or a new GitHub issue).
|
|
218
|
+
|
|
219
|
+
Synthesize a single fix-plan comment under the relevant `LIVE_VERIFICATION_vX.Y.Z.md` `Pre-tag gates` entry for `/gflow:doc-review`:
|
|
220
|
+
|
|
221
|
+
> _Council verdict: <GREEN|YELLOW|RED> across all 3 auditors. <N> findings; <M> Tier 1 fixed in commit <SHA>, <K> Tier 2 fixed in commit <SHA2>, <J> Tier 3 deferred to backlog. Council reports at `tmp/council/0{1,2,3}-*.md` (local-only)._
|
|
222
|
+
|
|
223
|
+
If any auditor returns RED, **stop and escalate to the user**. Do not apply fixes blindly to a RED finding — it usually means the doc is wrong about the code, the code is wrong about the doc, or both.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Output format
|
|
228
|
+
|
|
229
|
+
After each section write one line:
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
[0] Pre-flight — PASS (release spec at docs/superpowers/specs/YYYY-MM-DD-*.md)
|
|
233
|
+
[1] Version refs — PASS
|
|
234
|
+
[2] INDEX completeness — UPDATED (added AGENTS.md row)
|
|
235
|
+
[3] Evidence file — PASS
|
|
236
|
+
[4] Doc-link check — PASS (9 files, 0 broken)
|
|
237
|
+
[5] Skill files — UPDATED (refreshed /gflow:plan phase pointer)
|
|
238
|
+
[6] CHANGELOG footer — PASS
|
|
239
|
+
[7] Memory files — WARN: phase-b-followups.md has shipped items not yet ticked
|
|
240
|
+
[8] Council audit — YELLOW (11 findings, all fixed in commit abc1234)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Then list every **UPDATED** change, every **WARN** / **FAIL** finding, and the council fix list for the user to review.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Integration with `/gflow:release`
|
|
248
|
+
|
|
249
|
+
This skill is invoked at **step 9** of `/gflow:release` (between "review commands for staleness" and "commit the release prep"). The mechanical pass (sections 1–7) is the same as before; the council audit (section 8) is the new requirement and runs after the mechanical pass succeeds.
|
|
250
|
+
|
|
251
|
+
All discovered fixes are folded into the release prep commit unless genuinely unrelated to the release.
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## Post-release: memory consolidation
|
|
256
|
+
|
|
257
|
+
After the release ships and the back-merge completes, the **release spec** and **implementation plan** under `docs/superpowers/{specs,plans}/` are project-management artifacts, not user-facing docs. The durable knowledge they contain (patterns learned, governance rules, architecture decisions) should be extracted into project memory at `~/.claude/projects/<...>/memory/`, then the spec/plan files **deleted from the repo** in a final cleanup commit.
|
|
258
|
+
|
|
259
|
+
This keeps the public-facing `docs/` tree focused on what users and contributors need, while the planning artifacts live on as memory entries usable by future Claude Code sessions. See the `release-back-merge-gap-recovery` memory and the v0.8.1 release commit history for an example.
|
|
@@ -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
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# AGENTS.md — gflow-cli
|
|
2
|
+
|
|
3
|
+
> Universal entry point for AI coding agents. Read this first; everything else routes from here.
|
|
4
|
+
|
|
5
|
+
Supported tools that auto-discover this file: Cursor, Codex, Aider, Gemini CLI, Jules, Devin, Windsurf, Zed, Warp, opencode, RooCode, Amp, Junie, Phoenix, GitHub Copilot, VS Code, Factory, Augment, Semgrep, Kilo Code, UiPath. Claude Code reads [CLAUDE.md](CLAUDE.md), which cross-references this file.
|
|
6
|
+
|
|
7
|
+
## Project at a glance
|
|
8
|
+
|
|
9
|
+
- Unofficial Python CLI for [Google Flow](https://labs.google/fx/tools/flow) — drives Veo (image-to-video, text-to-video) and Imagen (text-to-image) generations from the terminal by reverse-engineering Flow's private REST API at `aisandbox-pa.googleapis.com`.
|
|
10
|
+
- Python 3.11+ · `uv`-managed · `hatchling` builds · Playwright Chromium transport · `pyright` strict · `ruff` · `pytest`.
|
|
11
|
+
- Single-package modular monolith. Top-level modules under `src/gflow_cli/`: `api/`, `auth/`, `browser_manager.py`, `cli.py`, `_cli_helpers.py`, `cli_image.py`, `cli_run.py`, `cli_video.py`, `config.py`, `errors.py`, `exceptions.py`, `image_batch.py`, `manifest.py`, `observability.py`, `paths.py`, `profile_store.py`.
|
|
12
|
+
- Requires a Google AI Ultra or Pro subscription with Flow access. All generations bill against the user's own Google account.
|
|
13
|
+
|
|
14
|
+
## Headed-browser dependency (architectural reality)
|
|
15
|
+
|
|
16
|
+
gflow-cli currently drives Flow via a **real Chrome session managed by Playwright** — `ui_automation` transport. Google's auth + reCAPTCHA stack rejects Playwright's bundled Chromium and most headless approaches. This is the project's defining trade-off:
|
|
17
|
+
|
|
18
|
+
- ✅ Works end-to-end against live Pro/Ultra accounts.
|
|
19
|
+
- ❌ Requires a saved Chrome profile, a display server for one-time login, and ~150 MB for Chromium.
|
|
20
|
+
- ❌ Cannot run on serverless / headless CI workers without prerecorded profile transplant.
|
|
21
|
+
- ❌ Per-account horizontal concurrency is capped by what one warm Page pool can drive.
|
|
22
|
+
|
|
23
|
+
If you can help unblock a pure HTTP transport (especially for video generation, where HTTP 401 + reCAPTCHA mints currently block us), please open an issue — see the README "Architecture & current limitations" section.
|
|
24
|
+
|
|
25
|
+
## Dev environment tips
|
|
26
|
+
|
|
27
|
+
- `uv sync` then `uv run playwright install chromium`. No global Python install needed.
|
|
28
|
+
- Copy `.env.template` to `.env.local`; never commit `.env.local`. It documents every env var.
|
|
29
|
+
- Output goes to `./tmp/` for scripts/tests or `$GFLOW_CLI_OUTPUT_DIR` for CLI outputs (defaults to `./out/`).
|
|
30
|
+
- One-time auth: `gflow auth login --browser chrome`. The `--browser chrome` flag is mandatory; the CLI fails fast on other strategies.
|
|
31
|
+
- Use `/gflow:plan` to see the active phase before starting work; `/gflow:known-issues` before touching auth or reCAPTCHA code paths.
|
|
32
|
+
|
|
33
|
+
## Testing instructions — The Impeccable Routine
|
|
34
|
+
|
|
35
|
+
Run these gates in order before every commit:
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
$env:PYTHONUTF8=1
|
|
39
|
+
uv run python scripts/ci/check_repo_hygiene.py
|
|
40
|
+
uv run ruff check src tests
|
|
41
|
+
uv run ruff format --check src tests
|
|
42
|
+
uv run pyright src
|
|
43
|
+
uv run python -m pytest -q --cov=gflow_cli
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Or invoke the wrapper: `/gflow:check`.
|
|
47
|
+
|
|
48
|
+
- Use `pytest -m "not live and not e2e"` locally; full suite OOMs on small dev machines. Scope to changed dirs; trust CI for the full sweep.
|
|
49
|
+
- TDD is non-negotiable. Coverage floor: 80% overall.
|
|
50
|
+
- Live tests (`@pytest.mark.live`) opt in via `GFLOW_LIVE=1`. E2E tests require `GFLOW_CLI_E2E_PROFILE`.
|
|
51
|
+
|
|
52
|
+
## Code style
|
|
53
|
+
|
|
54
|
+
- Type hints everywhere; `pyright` strict on `src/gflow_cli`.
|
|
55
|
+
- Structured logging only (`structlog`) — **never** raw `print()` or `import logging` in `src/`.
|
|
56
|
+
- Errors as RFC 9457 Problem Details with stable per-class exit codes (3–15). See `src/gflow_cli/errors.py::EXIT_CODE_MAP` for the complete mapping.
|
|
57
|
+
- 100-char line length, `ruff` configured. Imports sorted by `ruff` (isort rules).
|
|
58
|
+
|
|
59
|
+
## PR instructions
|
|
60
|
+
|
|
61
|
+
- Branch naming: `feature/`, `bugfix/`, `hotfix/`, `chore/`, `docs/`, `test/`, `release/` — never `claude/` or unprefixed.
|
|
62
|
+
- `develop` is the integration branch; `main` is protected. Releases tag off `main` only.
|
|
63
|
+
- **Never add AI attribution to commit messages.** `Co-Authored-By:` trailers are fine if the user asks for them; auto-generated "🤖 Generated with Claude Code" footers are not.
|
|
64
|
+
- Run `/gflow:check` (or the Impeccable Routine) before every commit.
|
|
65
|
+
- All releases require a signed annotated tag (`git tag -s vX.Y.Z`); CI rejects unsigned tags.
|
|
66
|
+
|
|
67
|
+
## Where to look next
|
|
68
|
+
|
|
69
|
+
- **Architecture & target shape** → [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)
|
|
70
|
+
- **Mandates & routing rules** → [docs/AGENT_GUIDE.md](docs/AGENT_GUIDE.md)
|
|
71
|
+
- **Full docs index** → [docs/INDEX.md](docs/INDEX.md)
|
|
72
|
+
- **Known issues** (read before touching auth / reCAPTCHA) → [KNOWN_ISSUES.md](KNOWN_ISSUES.md)
|
|
73
|
+
- **Active phase & backlog** → [PLAN.md](PLAN.md) or run `/gflow:plan`
|
|
74
|
+
- **Release protocol** → [RELEASE.md](RELEASE.md)
|
|
75
|
+
|
|
76
|
+
## Claude Code-specific notes
|
|
77
|
+
|
|
78
|
+
[CLAUDE.md](CLAUDE.md) carries the auto-load instructions Claude Code reads natively. It cross-references this file for the universal rules; Claude-Code-specific session protocol (skills, slash commands, memory) stays in CLAUDE.md.
|