wade-cli 0.30.2__tar.gz → 0.35.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.
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.wade.yml +22 -23
- {wade_cli-0.30.2 → wade_cli-0.35.0}/AGENTS.md +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/CHANGELOG.md +54 -0
- wade_cli-0.35.0/KNOWLEDGE.md +233 -0
- wade_cli-0.35.0/KNOWLEDGE.ratings.yml +94 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/PKG-INFO +44 -6
- {wade_cli-0.30.2 → wade_cli-0.35.0}/README.md +42 -4
- {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/architecture.md +9 -7
- {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/skills-system.md +2 -3
- {wade_cli-0.30.2 → wade_cli-0.35.0}/pyproject.toml +2 -2
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/__init__.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/autocomplete.py +8 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/main.py +54 -4
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/review.py +9 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/loader.py +31 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/hooks/plan_write_guard.py +4 -5
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/hooks/worktree_guard.py +4 -5
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/config.py +39 -6
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/delegation.py +4 -2
- wade_cli-0.35.0/src/wade/models/permission.py +78 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/task.py +12 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/base.py +6 -3
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/clickup.py +7 -2
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/github.py +8 -4
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/markdown.py +5 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/ai_resolution.py +116 -55
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/check_service.py +51 -12
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/delegation_service.py +9 -21
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/deps_service.py +4 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/__init__.py +6 -0
- wade_cli-0.35.0/src/wade/services/implementation_service/_shared.py +55 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/batch.py +17 -8
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/bootstrap.py +2 -12
- wade_cli-0.35.0/src/wade/services/implementation_service/cleanup.py +370 -0
- wade_cli-0.35.0/src/wade/services/implementation_service/core.py +789 -0
- wade_cli-0.35.0/src/wade/services/implementation_service/done.py +488 -0
- wade_cli-0.35.0/src/wade/services/implementation_service/draft_pr.py +191 -0
- wade_cli-0.35.0/src/wade/services/implementation_service/lifecycle.py +472 -0
- wade_cli-0.35.0/src/wade/services/implementation_service/sync.py +722 -0
- wade_cli-0.35.0/src/wade/services/init_service/__init__.py +16 -0
- wade_cli-0.35.0/src/wade/services/init_service/auth.py +96 -0
- wade_cli-0.35.0/src/wade/services/init_service/commands.py +707 -0
- wade_cli-0.35.0/src/wade/services/init_service/config_io.py +516 -0
- wade_cli-0.35.0/src/wade/services/init_service/manifest.py +146 -0
- wade_cli-0.35.0/src/wade/services/init_service/migrations.py +354 -0
- wade_cli-0.35.0/src/wade/services/init_service/prompts_ai.py +339 -0
- wade_cli-0.35.0/src/wade/services/init_service/prompts_setup.py +694 -0
- wade_cli-0.35.0/src/wade/services/init_service/shell.py +185 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/plan_service.py +138 -35
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/prompt_delivery.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/review_delegation_service.py +1 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/review_service.py +33 -24
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/smart_start.py +15 -2
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/skills/installer.py +1 -6
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/ui/console.py +2 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/install.py +23 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/implementation-session/SKILL.md +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_implement_work_done_contract.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_autostash.py +9 -9
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_implementation_lifecycle.py +15 -7
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_skill_install.py +2 -2
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/test_wade_live_ai_taskr.py +0 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_effort.py +13 -5
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_hooks/test_plan_write_guard.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_hooks/test_worktree_guard.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_delegation.py +5 -4
- wade_cli-0.35.0/tests/unit/test_permission_mode.py +436 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_clickup.py +14 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_github.py +22 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_markdown.py +9 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_ai_resolution.py +22 -6
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_bootstrap_allowlist.py +1 -8
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_catchup.py +28 -28
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_check.py +8 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_delegation_service.py +55 -6
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_deps_service.py +54 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_done_plan_flag.py +12 -12
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_done_via_direct_cleanup.py +27 -27
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_implementation_done_sync.py +194 -90
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_implementation_service.py +97 -40
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_init.py +166 -88
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_init_shell_integration.py +14 -14
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_plan_service.py +354 -4
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_post_implementation_lifecycle.py +52 -52
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_pr_summary_path.py +8 -8
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_preserve_session_data.py +16 -16
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_prompt_delivery.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_review_service.py +12 -12
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_smart_start.py +4 -2
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_smart_start_resume.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_sync_base_branch.py +12 -12
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_install.py +45 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_markdown.py +1 -1
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_yolo.py +78 -174
- wade_cli-0.30.2/KNOWLEDGE.md +0 -131
- wade_cli-0.30.2/KNOWLEDGE.ratings.yml +0 -30
- wade_cli-0.30.2/src/wade/services/implementation_service/core.py +0 -2869
- wade_cli-0.30.2/src/wade/services/init_service.py +0 -2770
- wade_cli-0.30.2/tests/fixtures/transcripts/gemini_session.txt +0 -30
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/auto-version.yml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/ci.yml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/pr-title-lint.yml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/publish.yml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/release.yml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.gitignore +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/.pre-commit-config.yaml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/CONTRIBUTING.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/assets/wade.png +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/docker-compose.e2e.yml +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/documentation-policies.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/extending.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/testing.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/install.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/auto_version.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/changelog.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/check-all.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/check.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/fmt.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/hooks/pre-push +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/install-hooks.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/release.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/setup-worktree.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-e2e-docker.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-e2e.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-live-ai-taskr.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-live-ai.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-live-gh.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/__main__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/admin.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/implementation_session.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/knowledge.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/plan_session.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/review_pr_comments_session.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/session_shared.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/task.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/worktree.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/migrations.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/schema.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/engine.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/repositories.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/tables.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/branch.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/pr.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/repo.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/stash.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/sync.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/worktree.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/hooks/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/logging/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/logging/context.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/logging/setup.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/batch.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/deps.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/events.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/review.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/session.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/_pr_delegate.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/registry.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/batch_review_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/usage_tracking.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/knowledge_search.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/knowledge_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/review_settle.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/task_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/skills/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/skills/pointer.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/ui/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/ui/prompts.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/clipboard.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/http.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/markdown.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/process.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/slug.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/terminal.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/token_usage_markdown.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/update_check.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/agents-pointer.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/deps-analysis.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/implement-context.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/plan-session.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-batch.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-code.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-plan.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-pr-comments.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/setup-worktree.sh.example +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/review-enforcement-rule.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/review-implementation-closing-step.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/review-plan-step.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/user-interaction.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/deps/SKILL.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/knowledge/SKILL.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/plan-session/SKILL.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/review-pr-comments-session/SKILL.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/task/SKILL.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/task/examples.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/task/plan-format.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/statusline-command.sh +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/conftest.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/_support.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/conftest.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/mock_gh_script.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_admin_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_check_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_knowledge_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_mock_gh_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_plan_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_review_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_smart_start_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_task_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_work_sync_list_contract.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/claude_session.txt +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/codex_session.txt +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/copilot_session.txt +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/generic_session.txt +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_check.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_git.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_init.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_knowledge.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_markdown_provider.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/test_wade_live_ai.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/test_wade_live_gh.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/test_cli_basics.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/conftest.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_done_review_hint.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_review_cli.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_session_subapps.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_shell_init.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_task_cli.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_work_cli.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/test_loader.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/test_migrations.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/test_migrations_atomic.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_console.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_db/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_db/test_repository_transactions.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_branch_slugify.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_detached_worktree.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_pr_base.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_repo.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_scaffold_commit.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_worktree_remove.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_hooks/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_batch.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_config_models.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_db.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_deps_models.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_deps_partition.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_review.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_task_models.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_github_pr.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_batch_review_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_knowledge_search.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_knowledge_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_review_delegation_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_task_service.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/__init__.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_http.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_process.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_prompts.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_slug.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_terminal.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_terminal_launch.py +0 -0
- {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_update_check.py +0 -0
|
@@ -7,50 +7,49 @@ project:
|
|
|
7
7
|
merge_strategy: PR
|
|
8
8
|
ai:
|
|
9
9
|
default_tool: claude
|
|
10
|
-
default_model: claude-
|
|
11
|
-
effort:
|
|
10
|
+
default_model: claude-opus-4.8
|
|
11
|
+
effort: xhigh
|
|
12
12
|
plan:
|
|
13
|
-
tool: claude
|
|
14
|
-
model: claude-opus-4.7
|
|
15
13
|
effort: xhigh
|
|
16
14
|
yolo: true
|
|
17
15
|
deps:
|
|
18
|
-
tool:
|
|
19
|
-
model: claude-sonnet-
|
|
16
|
+
tool: claude
|
|
17
|
+
model: claude-sonnet-5
|
|
20
18
|
mode: headless
|
|
21
|
-
|
|
19
|
+
effort: high
|
|
22
20
|
review_plan:
|
|
23
|
-
tool:
|
|
24
|
-
model: claude-sonnet-
|
|
21
|
+
tool: claude
|
|
22
|
+
model: claude-sonnet-5
|
|
25
23
|
mode: headless
|
|
24
|
+
effort: high
|
|
26
25
|
enabled: true
|
|
27
|
-
yolo: false
|
|
28
26
|
review_implementation:
|
|
29
|
-
tool:
|
|
30
|
-
model: claude-sonnet-
|
|
27
|
+
tool: claude
|
|
28
|
+
model: claude-sonnet-5
|
|
31
29
|
mode: headless
|
|
30
|
+
effort: high
|
|
32
31
|
enabled: true
|
|
33
|
-
yolo: false
|
|
34
32
|
review_batch:
|
|
35
|
-
tool:
|
|
36
|
-
model: claude-sonnet-
|
|
33
|
+
tool: claude
|
|
34
|
+
model: claude-sonnet-5
|
|
37
35
|
mode: interactive
|
|
36
|
+
effort: high
|
|
38
37
|
enabled: true
|
|
39
38
|
yolo: true
|
|
40
|
-
yolo:
|
|
39
|
+
yolo: false
|
|
41
40
|
models:
|
|
42
41
|
claude:
|
|
43
42
|
easy:
|
|
44
|
-
model: claude-
|
|
45
|
-
effort: xhigh
|
|
46
|
-
medium:
|
|
47
|
-
model: claude-sonnet-4.6
|
|
43
|
+
model: claude-haiku-4.5
|
|
48
44
|
effort: max
|
|
49
|
-
|
|
50
|
-
model: claude-
|
|
45
|
+
medium:
|
|
46
|
+
model: claude-sonnet-5
|
|
51
47
|
effort: high
|
|
48
|
+
complex:
|
|
49
|
+
model: claude-sonnet-5
|
|
50
|
+
effort: xhigh
|
|
52
51
|
very_complex:
|
|
53
|
-
model: claude-opus-4.
|
|
52
|
+
model: claude-opus-4.8
|
|
54
53
|
effort: xhigh
|
|
55
54
|
provider:
|
|
56
55
|
name: github
|
|
@@ -70,7 +70,7 @@ CLI modules are thin dispatch — they parse flags via Typer, then call service
|
|
|
70
70
|
|
|
71
71
|
### Key Design Patterns
|
|
72
72
|
|
|
73
|
-
- **AI Tool Adapters via crossby**: `AbstractAITool` and every tool-specific adapter (Claude, Cursor, Copilot,
|
|
73
|
+
- **AI Tool Adapters via crossby**: `AbstractAITool` and every tool-specific adapter (Claude, Cursor, Copilot, Codex, OpenCode, Antigravity, Antigravity CLI, VS Code) live in the external `crossby` dependency, not this repo. Wade's services import `crossby.ai_tools` and `crossby.models.ai` directly. Adding a new AI tool means contributing to crossby, not wade.
|
|
74
74
|
- **Provider Abstraction**: `AbstractTaskProvider` ABC with pluggable backends (GitHub via `gh` CLI, ClickUp via REST API, Markdown via a single central file). Non-GitHub providers compose `GitHubPRDelegateMixin` so PR-review APIs still flow through `gh`.
|
|
75
75
|
- **Prompts as .md Templates**: All AI prompts live in `templates/prompts/`, not inline strings.
|
|
76
76
|
- **Synchronous Only**: No asyncio. Process-level parallelism via multiple terminals.
|
|
@@ -4,6 +4,60 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Conventional Commits](https://conventionalcommits.org/).
|
|
6
6
|
|
|
7
|
+
## [v0.35.0] — 2026-07-24
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- refresh Antigravity support (CLI + IDE) for crossby 0.10.2 (#343) (8ff0f9a)
|
|
12
|
+
|
|
13
|
+
## [v0.34.0] — 2026-07-24
|
|
14
|
+
|
|
15
|
+
### Features
|
|
16
|
+
|
|
17
|
+
- add "auto" and "accept-edits" permission modes (#338) (5b82060)
|
|
18
|
+
|
|
19
|
+
## [v0.33.0] — 2026-07-23
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
- replace Gemini CLI support with Antigravity CLI (bump crossby to 0.10.x) (#336) (c54af6d)
|
|
24
|
+
|
|
25
|
+
## [v0.32.0] — 2026-07-23
|
|
26
|
+
|
|
27
|
+
### Features
|
|
28
|
+
|
|
29
|
+
- supersede existing issue when planning splits it into multiple plan files (#331) (2f1fb93)
|
|
30
|
+
|
|
31
|
+
## [v0.31.3] — 2026-07-22
|
|
32
|
+
|
|
33
|
+
### Bug Fixes
|
|
34
|
+
|
|
35
|
+
- --mode headless still blocks on TTY AI-selection confirm prompt (#332) (3095ed7)
|
|
36
|
+
|
|
37
|
+
## [v0.31.2] — 2026-07-17
|
|
38
|
+
|
|
39
|
+
### Refactoring
|
|
40
|
+
|
|
41
|
+
- convert init_service.py into a package of focused modules (#325) (25d19ef)
|
|
42
|
+
|
|
43
|
+
## [v0.31.1] — 2026-07-17
|
|
44
|
+
|
|
45
|
+
### Bug Fixes
|
|
46
|
+
|
|
47
|
+
- remove(stale=True) misclassifies worktree as ACTIVE when provider read fails in CI (regression from #315) (#327) (83edda9)
|
|
48
|
+
|
|
49
|
+
## [v0.31.0] — 2026-07-17
|
|
50
|
+
|
|
51
|
+
### Features
|
|
52
|
+
|
|
53
|
+
- modularize implementation_service/core.py into focused submodules (#315) (97c5767)
|
|
54
|
+
|
|
55
|
+
## [v0.30.3] — 2026-07-17
|
|
56
|
+
|
|
57
|
+
### Bug Fixes
|
|
58
|
+
|
|
59
|
+
- skip self-upgrade for editable uv-tool installs (#323) (65666ec)
|
|
60
|
+
|
|
7
61
|
## [v0.30.2] — 2026-07-16
|
|
8
62
|
|
|
9
63
|
### Bug Fixes
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Project Knowledge
|
|
2
|
+
|
|
3
|
+
Shared learnings from AI planning and implementation sessions.
|
|
4
|
+
Read this at the start of every session. Add new entries via `wade knowledge add`.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 6e38b3aa | 2026-03-27 | implementation | Issue #233
|
|
9
|
+
|
|
10
|
+
After migrating AI tool artifacts off main (#233): The managed gitignore (get_managed_gitignore_patterns in installer.py) now includes .claude/settings.json, .cursor/cli.json, and hook config files (.cursor/hooks.json, .github/hooks/hooks.json). These were not in the managed block before. The wade repo's own .gitignore also needed manual entries for the session files because the managed block is stale (it's regenerated by wade update, which can't be run from worktrees during implementation). When working in worktrees for the wade repo, always expect untracked session files if the managed gitignore block hasn't been updated recently.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 2b4d5319 | 2026-04-11 | implementation | Issue #272
|
|
15
|
+
|
|
16
|
+
When knowledge commands run from a linked git worktree, load_config() finds
|
|
17
|
+
the .wade.yml copied to the worktree and sets project_root to the worktree
|
|
18
|
+
directory. The fix: detect the main checkout using git worktree list
|
|
19
|
+
--porcelain and redirect all knowledge reads/writes there.
|
|
20
|
+
_canonical_project_root() handles expected operational errors (ImportError,
|
|
21
|
+
GitError, OSError) and falls back to project_root; unexpected exceptions
|
|
22
|
+
propagate so real bugs are not silently swallowed. Apply at the top of service
|
|
23
|
+
functions (append_knowledge, get_annotated_knowledge) and in CLI commands
|
|
24
|
+
that resolve paths directly (resolve_canonical_knowledge_path wrapper).
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 54326c98 | 2026-04-18 | plan | tags: model-registry, effort, claude
|
|
29
|
+
|
|
30
|
+
claude-opus-4-7 is the current most-capable Claude model (dotted internal form: claude-opus-4.7). It introduces the xhigh effort level (between high and max). Cursor agent binary renamed short-form model IDs (opus-4.6 → claude-4.6-opus-high etc.) and embeds effort in names; thinking models are now claude-opus-4-7-thinking-{effort} not {model}-thinking. Codex renamed --yolo to --ask-for-approval (-a never for automation). probe_models.py had two bugs: claude parsing extracted prose words instead of model IDs, and opencode subcommand help check was wrong (should check 'opencode run --help' not top-level).
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## b6a3a637 | 2026-04-19 | implementation | tags: plan-session, skills, templates | Issue #278
|
|
35
|
+
|
|
36
|
+
When the plan-session 'Your role' step numbering changes, the _partials/review-plan-step.md partial also has a hardcoded step number that must be kept in sync. After adding 2 steps in #278, the partial moved from step 5 to step 7.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 164c355e | 2026-04-23 | plan | tags: knowledge, bug
|
|
41
|
+
|
|
42
|
+
parse_entries only handles dated entries ('## YYYY-MM-DD | Title' format). Plain '## Title' headings return [] from parse_entries, causing search to silently find nothing and dump the full file (header=text fallback bug). Fix: add fallback plain-heading regex, make ParsedEntry.date optional, fix header fallback when entries==[], and early-exit CLI get() when entries_count==0 after filtering.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## cae0f47a | 2026-04-24 | plan | tags: hooks, claude-code
|
|
47
|
+
|
|
48
|
+
Claude Code's PreToolUse hook JSON schema only allows 'hookSpecificOutput' at the root level. Extra root-level fields ('permission', 'permissionDecision', 'decision', 'reason') cause strict schema validation failure: 'Hook JSON output validation failed — (root): Invalid input', which makes the hook fail open (write is allowed). The correct deny output is: {"hookSpecificOutput": {"hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "..."}}
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## b61e247e | 2026-04-24 | plan | tags: skills, prompts, architecture
|
|
53
|
+
|
|
54
|
+
Session prompt templates (templates/prompts/) are NOT symlinked — they are read directly by service code (plan_service.py, implementation_service/core.py). Skill files (templates/skills/) ARE symlinked into .claude/skills/. When fixing agent instructions, check BOTH the skill files AND the prompt templates, as they can contradict each other.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## cedeaad0 | 2026-04-24 | plan | tags: plan-session, implementation-session, skills, review
|
|
59
|
+
|
|
60
|
+
Review cycles should be capped at 2 total runs: 1 run if findings are minor (fix and proceed without re-review); 2 runs if findings are major (fix and re-run once, then always proceed). This prevents agents from looping indefinitely. The cap is enforced via text in _partials/review-plan-step.md and _partials/review-implementation-closing-step.md.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## e2a49ac1 | 2026-04-26 | implementation | tags: knowledge
|
|
65
|
+
|
|
66
|
+
Entry quality rules live in the `## Entry style` section of `templates/skills/knowledge/SKILL.md` (positioned before `## Adding entries`): one insight per entry, lead with key fact, ≤3 sentences, no preamble/hedging — a before/after example is included. Knowledge is not a changelog; `## Adding entries` explains what to capture vs. skip.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## ddc10718 | 2026-04-27 | implementation | tags: plan-session, prompts, ai-behavior | Issue #281
|
|
71
|
+
|
|
72
|
+
When writing instructions for AI tools, "ask the user X" is not sufficient to prevent the tool from using native UI components (e.g. AskUserQuestion with pre-defined options). You must explicitly say "output a plain text question" and "do NOT use a native selection/question component or present pre-defined categories."
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 3463fbd4 | 2026-04-27 | implementation | tags: skills, prompts, architecture | Issue #295
|
|
77
|
+
|
|
78
|
+
When editing agent session rules, check BOTH templates/skills/<name>/SKILL.md AND templates/prompts/<name>.md — skills are symlinked into .claude/skills/ while prompts are read directly by service code. Changes to one without the other can leave contradictory instructions.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 6264c1a6 | 2026-04-27 | plan | tags: github, gh-cli, labels
|
|
83
|
+
|
|
84
|
+
`gh label list --search <name>` is unreliable for label-existence checks — it returns empty for label names that exist (verified for `bug`, `complexity:medium`, `review-addressed-by:claude`). Use `gh api repos/{slug}/labels/{url-encoded-name}` with `check=False` instead; it returns 200 if the label exists and 404 if not.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 1c18f1d4 | 2026-04-28 | plan | tags: delegation, yolo, headless, ai-tools
|
|
89
|
+
|
|
90
|
+
wade's headless AI delegation (mode: headless for deps and review_*) should rely on permissions.allowed_commands, not yolo. Why: (1) codex exec auto-defaults approval_policy=never, making yolo args (-a never) redundant. (2) For Claude/Copilot/Cursor, headless analytical tasks (read repo, emit output) don't need write permissions, so yolo over-grants. (3) Headless yolo passthrough was added in PR #146 (commit 26771d3) but worked fine before that. The init wizard prompting "Enable YOLO mode for plan review?" on a headless subprocess is confusing UX.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## cc91cd11 | 2026-04-28 | plan | tags: review, review-polling, coderabbit
|
|
95
|
+
|
|
96
|
+
CodeRabbit's `COMPLETED` bot status (detected from the summary comment marker
|
|
97
|
+
in `detect_coderabbit_review_status` — `models/review.py:68-99`) does NOT
|
|
98
|
+
guarantee the inline-review-comment stream is finished. The marker flips when
|
|
99
|
+
CodeRabbit edits its summary comment, but individual inline comments can keep
|
|
100
|
+
arriving for a few seconds afterward.
|
|
101
|
+
|
|
102
|
+
Implication for any "is the review burst over?" heuristic in
|
|
103
|
+
`review_service.py`: do not treat `bot_status == COMPLETED` alone as
|
|
104
|
+
"reviewer is done posting." Use the freshness of the inline comments themselves
|
|
105
|
+
(`ReviewComment.created_at` — populated by the GraphQL provider in
|
|
106
|
+
`providers/github.py:405`) and/or `PRReview.submitted_at` as the direct signal,
|
|
107
|
+
and keep `bot_status` as a secondary input only.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 08f59f5c | 2026-04-28 | implementation | tags: testing, mocking, datetime, mypy | Issue #302
|
|
112
|
+
|
|
113
|
+
When a service does 'from datetime import UTC, datetime' and calls datetime.now(UTC), patch the module-level class reference (e.g. wade.services.review_service.datetime). Set mock_datetime.now.return_value = fixed_now. Avoid naming local variables 'now' as datetime when the same function later uses 'now = time.time()' (float) — mypy strict mode flags the type mismatch even across mutually-exclusive code paths (use a distinct name like 'settle_now').
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 4863036c | 2026-07-16 | plan | tags: refactoring, testing, mocking, architecture
|
|
118
|
+
|
|
119
|
+
When splitting a wade service module into submodules, moving a function to a new module breaks tests that patch its dependencies: the suite patches fully-qualified paths heavily (e.g. mock.patch("wade.services.implementation_service.core.git_sync"), ~200+ such sites), and mock.patch binds where a name is looked up. Repoint every moved function's patch targets to its new submodule. Also note: the implementation_service package re-exports via "from .sub import *", which does NOT re-export underscore-prefixed helpers — re-export those explicitly in __init__.py.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## a24d65b0 | 2026-07-16 | plan | tags: update, self-upgrade, gotcha
|
|
124
|
+
|
|
125
|
+
`wade update` self-upgrade can infinitely re-exec. Three defects combine:
|
|
126
|
+
(1) `utils/install._run_upgrade` treats package-manager exit code 0 as a successful upgrade — but `uv tool upgrade wade-cli` exits 0 for no-ops too (already up to date, or the target version is yanked/unavailable), so a no-op is reported as success;
|
|
127
|
+
(2) `services/init_service._maybe_self_upgrade` calls `re_exec()` with no loop guard — after re-exec it re-runs the same check with no memory it just tried and no check that the version actually advanced;
|
|
128
|
+
(3) `utils/update_check.check_for_update` trusts the 2-hour nag cache at `~/.local/share/wade/update-check.json`. A stale/yanked `latest_version` (observed: cache said 0.30.1 while 0.29.6 was installed and was repo HEAD) makes every re-exec take the identical upgrade path → infinite "wade upgraded — restarting..." loop for the whole cache TTL.
|
|
129
|
+
Fix: add a re-exec breadcrumb env var (WADE_SELF_UPGRADE_FROM=<old version>) so a post-re-exec process detects the version did NOT advance and stops with a warning; force a cache-bypassing fresh PyPI check for the explicit self-upgrade path; and skip yanked releases when selecting the latest version.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## d65003eb | 2026-07-16 | implementation | tags: testing, mocking | Issue #321
|
|
134
|
+
|
|
135
|
+
Functions imported locally inside a function body (e.g. `from wade.utils.install import detect_install_method` inside `_maybe_self_upgrade()`) must be mock-patched at their *source* module (`wade.utils.install.detect_install_method`), not at the importing module (`wade.services.init_service.detect_install_method`) — the local import re-resolves the name from the source module at call time, so patching the importer's namespace has no effect.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## c71d1a70 | 2026-07-16 | implementation | tags: pypi | Issue #321
|
|
140
|
+
|
|
141
|
+
PyPI's JSON API (pypi.org/pypi/<pkg>/json) does not expose a top-level 'yanked' flag on `info` — yanked status lives per-file inside `releases[version]`, where each file dict has a `yanked` bool. `info.version` does not account for yanking, so it can point at a release that pip/uv will refuse to install; select from `releases` and filter out versions where every file is yanked instead of trusting `info.version`.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## bcfa4bb3 | 2026-07-17 | implementation | tags: skills, prompts, architecture | Issue #314
|
|
146
|
+
|
|
147
|
+
Session prompt templates (templates/prompts/) are NOT symlinked — they are read directly by service code: plan_service.py and implementation_service/draft_pr.py (build_implementation_prompt, moved there from core.py in the #314 split). Skill files (templates/skills/) ARE symlinked into .claude/skills/. When fixing agent instructions, check BOTH the skill files AND the prompt templates.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## 0bad70f3 | 2026-07-17 | implementation | tags: testing, mocking, refactoring | Issue #314
|
|
152
|
+
|
|
153
|
+
When splitting a wade service module, a module-level dependency import must stay module-level (not function-local) if any test patches it via that module (e.g. done.load_config). mock.patch resolves the attribute on the module object; a function-local import re-binds from the source module at call time, so the patch is silently ignored. Also: a moved helper imported into several modules is patched in the CALLER's namespace (e.g. find_worktree_path is patched at done./cleanup./core. depending on which function is under test), not where it is defined (_shared).
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## b7ff010c | 2026-07-17 | implementation | tags: refactoring, architecture, imports | Issue #317
|
|
158
|
+
|
|
159
|
+
When splitting a service module into a package, a constant/helper shared by a leaf submodule and an upper one must live in the LEAF, not the upper module — the upper already imports from the leaf, so hosting it upstream creates an import cycle. E.g. init_service `_COMMAND_OVERRIDE_NAMES` belongs in config_io (a leaf), not prompts_setup, since prompts_setup imports `_resolve_models` from config_io.
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 129ab9bd | 2026-07-17 | plan | tags: testing, providers, error-handling | Issue #326
|
|
164
|
+
|
|
165
|
+
GitHubProvider.read_task_or_none() raises RuntimeError (not silently returns None) on any gh CLI failure that isn't a genuine 'not found' match — e.g. missing GH_TOKEN, auth, network, rate-limit. Callers relying on it as a fail-safe (e.g. classify_staleness's task_lookup_failed) must catch exceptions around the call, not just check for None.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 3045ea00 | 2026-07-17 | plan | tags: testing, mocking, ci | Issue #326
|
|
170
|
+
|
|
171
|
+
Tests that call remove(stale=True)/_remove_stale() or list_sessions() in cleanup.py must mock wade.services.implementation_service.cleanup.get_provider (not just cleanup.load_config), or they instantiate a real GitHubProvider and shell out to gh — passing locally with authenticated gh but failing in CI with no GH_TOKEN. See TestListSessions.test_gracefully_handles_issue_lookup_failures for the mocking pattern.
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 702b274f | 2026-07-21 | plan | tags: prompts, cli, ux
|
|
176
|
+
|
|
177
|
+
wade/ui/prompts.py helpers such as confirm, input_prompt, select, and menu return their configured default when stdin is not a TTY; multi_select returns all items. When adding an interactive prompt in a service/CLI path, do NOT write your own non-interactive detection — just pass a sensible default and rely on this. The idiom for an auto-proceed-under-yolo confirmation is: proceed = yolo or prompts.confirm(msg, default=True).
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## c7a450ff | 2026-07-21 | implementation | tags: testing, python | Issue #330
|
|
182
|
+
|
|
183
|
+
Python's parenthesized with-statement (with (a, b, c):) does not support unpacking a list of context managers via *patches — it's a syntax error, not a runtime one. To share a list of mock.patch(...) objects across multiple tests, use contextlib.ExitStack() and call stack.enter_context(p) for each, capturing return values for assertions.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## b6ca74e5 | 2026-07-23 | plan | tags: git, gh, pr-merge | Issue #333
|
|
188
|
+
|
|
189
|
+
gh pr merge <n> --squash --delete-branch (wrapped by git_pr.merge_pr, run with cwd=repo_root) performs the remote squash-merge FIRST, then does local --delete-branch bookkeeping which resolves the cwd repo's current branch. If that clone has a detached HEAD, gh aborts with "could not determine current branch: not on any branch" AFTER the PR is already merged on GitHub — a "merged-on-GitHub-but-reported-failed" inconsistency. Any guard on repo_root HEAD state (e.g. re-attaching it) MUST run BEFORE calling merge_pr, so a fail-fast path avoids the irreversible remote merge. _merge_pr in lifecycle.py is shared by review_service.py and smart_start.py.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## 9f5e5e2c | 2026-07-23 | plan | tags: crossby, ai-tools, permission-mode
|
|
194
|
+
|
|
195
|
+
crossby exposes an autonomy/permission axis orthogonal to WADE's DelegationMode (prompt/interactive/headless): pass yolo/auto/accept_edits booleans to AbstractAITool.launch()/build_launch_command(). crossby owns the precedence ladder yolo > auto > accept_edits > default > plan and does capability-aware downgrades with warnings in _autonomy_launch_args (ai_tools/base.py) — WADE forwards intent, it must not re-implement gating. auto (classifier-mediated) is Claude-only among CLIs and downgrades to accept-edits elsewhere.
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 38aa4f95 | 2026-07-23 | plan | tags: crossby, ai-tools, antigravity
|
|
200
|
+
|
|
201
|
+
crossby has two separate Antigravity adapters, easy to confuse: AIToolID.ANTIGRAVITY (GUI IDE, binary "antigravity", non-blocking/detached, no headless or yolo) and AIToolID.ANTIGRAVITY_CLI = "antigravity-cli" (terminal agent, binary "agy", blocking, supports headless --print, effort, yolo, and plan/accept-edits via --mode). The CLI one is the Gemini-CLI replacement and flows through WADE's standard terminal launch path.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 669d0bb8 | 2026-07-23 | implementation | tags: migration, symlinks, gotcha | Issue #335
|
|
206
|
+
|
|
207
|
+
wade cross-tool skill alias dirs (.gemini/skills, .github/skills, .agents/skills, .cursor/skills) are SYMLINKS to .claude/skills, not real dirs. Cleanup/migration code must remove them via is_symlink()/unlink(), never is_dir()/rmdir(): Path.is_dir() returns False on a dangling symlink (the .claude/skills target may already be pruned earlier in the same wade update run), and os.rmdir() on a live symlink-to-dir raises NotADirectoryError. Only rmdir the real .gemini sub-dirs (hooks, policies) and guard with 'not is_symlink() and not any(iterdir())'.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## 9b40e000 | 2026-07-23 | implementation | tags: ai-tools, antigravity, testing | Issue #335
|
|
212
|
+
|
|
213
|
+
crossby's antigravity-cli adapter is permissive where the removed gemini adapter was strict: is_model_compatible() returns True for ANY model (including claude-* models), and capabilities().supports_effort is True. Consequences for wade tests: (1) a tool/model incompatibility test (resolve_model -> None) cannot use antigravity-cli — use codex, which rejects claude models; (2) capability-gated interactive wizard tests (_prompt_command_overrides) gain an extra effort prompt when the override tool is antigravity-cli, shifting mock_select index sequences vs the old gemini flow (gemini had supports_effort=False).
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 271cf18f | 2026-07-24 | implementation | tags: review, headless, timeout | Issue #337
|
|
218
|
+
|
|
219
|
+
wade review implementation runs a headless AI subprocess with a bounded timeout (300s observed via wade.utils.process subprocess.timeout). On large diffs (~500+ lines) a high-effort model cannot finish and the command exits 1 with "Headless session timed out" — this is an infra timeout, not a review finding. Workarounds: run `wade review implementation --mode prompt` and self-review the printed diff, or raise the review command timeout in .wade.yml (ai.review_implementation.timeout).
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## cc136dba | 2026-07-24 | plan | tags: crossby, ai-tools, antigravity, capabilities
|
|
224
|
+
|
|
225
|
+
wade never branches on crossby's AIToolType/tool_type (only re-exported in wade.models); it gates GUI-vs-terminal launch behavior on the blocks_until_exit capability instead (delegation_service, review_service, plan_service, implementation_service). So crossby 0.10.2 reclassifying the Antigravity IDE from TERMINAL to GUI (display 'Antigravity IDE', launch 'antigravity <workdir>', added to UNSUPPORTED_TOOLS) needs no wade code change — the non-blocking (blocks_until_exit=False) path already covers it.
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 16bc7261 | 2026-07-24 | implementation | tags: testing, antigravity, ai-tools, crossby | Issue #342
|
|
230
|
+
|
|
231
|
+
To unit-test a crossby GUI adapter launch command (Antigravity IDE, VS Code), patch `crossby.ai_tools.<module>.run_with_transcript` (e.g. crossby.ai_tools.antigravity.run_with_transcript) and read call_args[0][0] — GUI adapters build the cmd and call crossby's run_with_transcript directly, so patching wade.utils.process/subprocess never fires. The Antigravity IDE cmd is exactly ["antigravity", str(working_dir)] (explicit dir, not ".").
|
|
232
|
+
|
|
233
|
+
---
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
0bad70f3:
|
|
2
|
+
down: 0
|
|
3
|
+
stale: 0
|
|
4
|
+
up: 3
|
|
5
|
+
164c355e:
|
|
6
|
+
down: 0
|
|
7
|
+
stale: 0
|
|
8
|
+
up: 1
|
|
9
|
+
1c18f1d4:
|
|
10
|
+
down: 0
|
|
11
|
+
stale: 0
|
|
12
|
+
up: 4
|
|
13
|
+
271cf18f:
|
|
14
|
+
down: 0
|
|
15
|
+
stale: 0
|
|
16
|
+
up: 1
|
|
17
|
+
2b4d5319:
|
|
18
|
+
down: 0
|
|
19
|
+
stale: 0
|
|
20
|
+
up: 2
|
|
21
|
+
3045ea00:
|
|
22
|
+
down: 0
|
|
23
|
+
stale: 0
|
|
24
|
+
up: 1
|
|
25
|
+
3463fbd4:
|
|
26
|
+
down: 0
|
|
27
|
+
stale: 0
|
|
28
|
+
up: 2
|
|
29
|
+
38aa4f95:
|
|
30
|
+
down: 0
|
|
31
|
+
stale: 0
|
|
32
|
+
up: 5
|
|
33
|
+
4863036c:
|
|
34
|
+
down: 0
|
|
35
|
+
stale: 0
|
|
36
|
+
up: 4
|
|
37
|
+
54326c98:
|
|
38
|
+
down: 1
|
|
39
|
+
stale: 0
|
|
40
|
+
up: 0
|
|
41
|
+
6e38b3aa:
|
|
42
|
+
down: 0
|
|
43
|
+
stale: 0
|
|
44
|
+
up: 1
|
|
45
|
+
702b274f:
|
|
46
|
+
down: 0
|
|
47
|
+
stale: 0
|
|
48
|
+
up: 1
|
|
49
|
+
9b40e000:
|
|
50
|
+
down: 0
|
|
51
|
+
stale: 0
|
|
52
|
+
up: 3
|
|
53
|
+
9f5e5e2c:
|
|
54
|
+
down: 0
|
|
55
|
+
stale: 0
|
|
56
|
+
up: 5
|
|
57
|
+
a24d65b0:
|
|
58
|
+
down: 0
|
|
59
|
+
stale: 0
|
|
60
|
+
superseded_by: c71d1a70
|
|
61
|
+
up: 1
|
|
62
|
+
b61e247e:
|
|
63
|
+
down: 0
|
|
64
|
+
stale: 0
|
|
65
|
+
superseded_by: bcfa4bb3
|
|
66
|
+
up: 4
|
|
67
|
+
b6a3a637:
|
|
68
|
+
down: 0
|
|
69
|
+
stale: 0
|
|
70
|
+
up: 1
|
|
71
|
+
cae0f47a:
|
|
72
|
+
down: 0
|
|
73
|
+
stale: 0
|
|
74
|
+
up: 1
|
|
75
|
+
cc136dba:
|
|
76
|
+
down: 0
|
|
77
|
+
stale: 0
|
|
78
|
+
up: 1
|
|
79
|
+
cc91cd11:
|
|
80
|
+
down: 0
|
|
81
|
+
stale: 0
|
|
82
|
+
up: 3
|
|
83
|
+
cedeaad0:
|
|
84
|
+
down: 1
|
|
85
|
+
stale: 0
|
|
86
|
+
up: 1
|
|
87
|
+
d65003eb:
|
|
88
|
+
down: 0
|
|
89
|
+
stale: 0
|
|
90
|
+
up: 2
|
|
91
|
+
e2a49ac1:
|
|
92
|
+
down: 0
|
|
93
|
+
stale: 0
|
|
94
|
+
up: 3
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wade-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.35.0
|
|
4
4
|
Summary: WADE — Workflow for AI-Driven Engineering
|
|
5
5
|
Project-URL: Homepage, https://github.com/ivanviragine/wade
|
|
6
6
|
Project-URL: Repository, https://github.com/ivanviragine/wade
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Classifier: Topic :: Software Development :: Version Control :: Git
|
|
18
18
|
Requires-Python: >=3.11
|
|
19
|
-
Requires-Dist: crossby<0.
|
|
19
|
+
Requires-Dist: crossby<0.11.0,>=0.10.2
|
|
20
20
|
Requires-Dist: httpx<1.0,>=0.27
|
|
21
21
|
Requires-Dist: pydantic-settings>=2.0
|
|
22
22
|
Requires-Dist: pydantic>=2.0
|
|
@@ -45,7 +45,7 @@ Description-Content-Type: text/markdown
|
|
|
45
45
|
|
|
46
46
|
*Every Wade does the dirty work so the heroes don't have to.*
|
|
47
47
|
|
|
48
|
-
Branches, worktrees, context loading, model selection, PR creation — all the workflow friction that surrounds AI coding sessions. WADE eliminates it. Works with `Claude Code`, `Copilot`, `
|
|
48
|
+
Branches, worktrees, context loading, model selection, PR creation — all the workflow friction that surrounds AI coding sessions. WADE eliminates it. Works with `Claude Code`, `Copilot`, `Antigravity CLI`, `Codex`, and more. Run `wade init` once per project, then just point it at a GitHub *(more to come!)* issue number.
|
|
49
49
|
|
|
50
50
|
## See It in Action
|
|
51
51
|
|
|
@@ -179,7 +179,39 @@ wade 42
|
|
|
179
179
|
|
|
180
180
|
Short aliases: `wade p` (plan), `wade i <N>` (implement), `wade r <N>` (review pr-comments).
|
|
181
181
|
|
|
182
|
-
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, and `--yolo` to override configured defaults. `implement` also supports `--detach` (new terminal tab) and `--cd` (print worktree path only).
|
|
182
|
+
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `implement` also supports `--detach` (new terminal tab) and `--cd` (print worktree path only).
|
|
183
|
+
|
|
184
|
+
`--permission-mode` sets how much autonomy the AI tool is granted — an axis
|
|
185
|
+
independent of the delegation `--mode` (which controls *how* a tool is
|
|
186
|
+
dispatched: prompt/interactive/headless). The tiers, most→least permissive, are
|
|
187
|
+
`yolo` > `auto` > `accept-edits` > `default`:
|
|
188
|
+
|
|
189
|
+
| Tier | Behavior |
|
|
190
|
+
|------|----------|
|
|
191
|
+
| `default` | Prompt for every action (no autonomy grant). |
|
|
192
|
+
| `accept-edits` | Auto-apply file edits; still prompt for shell/commands. Claude and Antigravity CLI. |
|
|
193
|
+
| `auto` | Classifier-mediated auto mode (a model reviews each non-read action). Claude only. |
|
|
194
|
+
| `yolo` | Full autonomy — no prompts. |
|
|
195
|
+
|
|
196
|
+
`--yolo` is a back-compat alias for `--permission-mode yolo`; an explicit
|
|
197
|
+
`--permission-mode` wins when both are given. The same values are accepted in
|
|
198
|
+
`.wade.yml` as `ai.permission_mode` (global) or `ai.<command>.permission_mode`
|
|
199
|
+
(per-command), with `yolo: true` still honored as the alias. A tier a tool
|
|
200
|
+
doesn't support is downgraded automatically (e.g. `auto` → `accept-edits` on
|
|
201
|
+
non-Claude tools) with a warning — WADE forwards the requested tier and
|
|
202
|
+
[`crossby`](https://github.com/ivanviragine/crossby) owns the downgrade ladder.
|
|
203
|
+
Headless commands (`deps`, `review_*`) always run at `default`. `plan` is not a
|
|
204
|
+
permission mode — it's driven separately — and is rejected (warn + fall back to
|
|
205
|
+
`default`) if configured.
|
|
206
|
+
|
|
207
|
+
`wade plan --issue <N>` re-plans an existing issue. If the session produces a
|
|
208
|
+
single plan file, it's attached to `#N` and the issue stays open. If the
|
|
209
|
+
session decides the work should be split into several independent pieces
|
|
210
|
+
(2+ plan files), `#N` is **superseded**: a new issue + draft PR is created
|
|
211
|
+
per plan file, a comment and a `> **Superseded by ...**` banner are added to
|
|
212
|
+
`#N`, and it's closed as *not planned* (confirmed via prompt unless
|
|
213
|
+
`--yolo`/non-interactive). If any plan file fails to become an issue, `#N` is
|
|
214
|
+
left open with a warning instead of superseding on a partial split.
|
|
183
215
|
|
|
184
216
|
## Supported AI Tools
|
|
185
217
|
|
|
@@ -190,11 +222,17 @@ Adapters, model/effort resolution, and per-tool config (allowlists, hooks) are p
|
|
|
190
222
|
| [Claude Code](https://claude.com/product/claude-code) | `claude` |
|
|
191
223
|
| [Cursor](https://www.cursor.com/) | `cursor` |
|
|
192
224
|
| [GitHub Copilot](https://github.com/features/copilot/cli) | `copilot` |
|
|
193
|
-
| [Google Gemini](https://geminicli.com/) | `gemini` |
|
|
194
225
|
| [OpenAI Codex](https://developers.openai.com/codex/cli/) | `codex` |
|
|
195
226
|
| [OpenCode](https://opencode.ai/) | `opencode` |
|
|
196
227
|
| [VS Code](https://github.com/features/copilot/ai-code-editor) | `code` |
|
|
197
|
-
| [Antigravity](https://antigravity.google/) | `antigravity` |
|
|
228
|
+
| [Antigravity IDE](https://antigravity.google/) | `antigravity` |
|
|
229
|
+
| [Antigravity CLI](https://antigravity.google/) | `agy` |
|
|
230
|
+
|
|
231
|
+
> In `.wade.yml`, refer to a tool by its **config ID**, which matches the binary
|
|
232
|
+
> above except for VS Code (`vscode`) and Antigravity CLI (`antigravity-cli`).
|
|
233
|
+
> Antigravity IDE (config ID `antigravity`) is launch-only — WADE opens your
|
|
234
|
+
> workspace in the desktop app; its workflow files are provisioned via the
|
|
235
|
+
> Antigravity CLI's shared `.agents/` layout.
|
|
198
236
|
|
|
199
237
|
## Task Providers
|
|
200
238
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
*Every Wade does the dirty work so the heroes don't have to.*
|
|
10
10
|
|
|
11
|
-
Branches, worktrees, context loading, model selection, PR creation — all the workflow friction that surrounds AI coding sessions. WADE eliminates it. Works with `Claude Code`, `Copilot`, `
|
|
11
|
+
Branches, worktrees, context loading, model selection, PR creation — all the workflow friction that surrounds AI coding sessions. WADE eliminates it. Works with `Claude Code`, `Copilot`, `Antigravity CLI`, `Codex`, and more. Run `wade init` once per project, then just point it at a GitHub *(more to come!)* issue number.
|
|
12
12
|
|
|
13
13
|
## See It in Action
|
|
14
14
|
|
|
@@ -142,7 +142,39 @@ wade 42
|
|
|
142
142
|
|
|
143
143
|
Short aliases: `wade p` (plan), `wade i <N>` (implement), `wade r <N>` (review pr-comments).
|
|
144
144
|
|
|
145
|
-
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, and `--yolo` to override configured defaults. `implement` also supports `--detach` (new terminal tab) and `--cd` (print worktree path only).
|
|
145
|
+
Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `implement` also supports `--detach` (new terminal tab) and `--cd` (print worktree path only).
|
|
146
|
+
|
|
147
|
+
`--permission-mode` sets how much autonomy the AI tool is granted — an axis
|
|
148
|
+
independent of the delegation `--mode` (which controls *how* a tool is
|
|
149
|
+
dispatched: prompt/interactive/headless). The tiers, most→least permissive, are
|
|
150
|
+
`yolo` > `auto` > `accept-edits` > `default`:
|
|
151
|
+
|
|
152
|
+
| Tier | Behavior |
|
|
153
|
+
|------|----------|
|
|
154
|
+
| `default` | Prompt for every action (no autonomy grant). |
|
|
155
|
+
| `accept-edits` | Auto-apply file edits; still prompt for shell/commands. Claude and Antigravity CLI. |
|
|
156
|
+
| `auto` | Classifier-mediated auto mode (a model reviews each non-read action). Claude only. |
|
|
157
|
+
| `yolo` | Full autonomy — no prompts. |
|
|
158
|
+
|
|
159
|
+
`--yolo` is a back-compat alias for `--permission-mode yolo`; an explicit
|
|
160
|
+
`--permission-mode` wins when both are given. The same values are accepted in
|
|
161
|
+
`.wade.yml` as `ai.permission_mode` (global) or `ai.<command>.permission_mode`
|
|
162
|
+
(per-command), with `yolo: true` still honored as the alias. A tier a tool
|
|
163
|
+
doesn't support is downgraded automatically (e.g. `auto` → `accept-edits` on
|
|
164
|
+
non-Claude tools) with a warning — WADE forwards the requested tier and
|
|
165
|
+
[`crossby`](https://github.com/ivanviragine/crossby) owns the downgrade ladder.
|
|
166
|
+
Headless commands (`deps`, `review_*`) always run at `default`. `plan` is not a
|
|
167
|
+
permission mode — it's driven separately — and is rejected (warn + fall back to
|
|
168
|
+
`default`) if configured.
|
|
169
|
+
|
|
170
|
+
`wade plan --issue <N>` re-plans an existing issue. If the session produces a
|
|
171
|
+
single plan file, it's attached to `#N` and the issue stays open. If the
|
|
172
|
+
session decides the work should be split into several independent pieces
|
|
173
|
+
(2+ plan files), `#N` is **superseded**: a new issue + draft PR is created
|
|
174
|
+
per plan file, a comment and a `> **Superseded by ...**` banner are added to
|
|
175
|
+
`#N`, and it's closed as *not planned* (confirmed via prompt unless
|
|
176
|
+
`--yolo`/non-interactive). If any plan file fails to become an issue, `#N` is
|
|
177
|
+
left open with a warning instead of superseding on a partial split.
|
|
146
178
|
|
|
147
179
|
## Supported AI Tools
|
|
148
180
|
|
|
@@ -153,11 +185,17 @@ Adapters, model/effort resolution, and per-tool config (allowlists, hooks) are p
|
|
|
153
185
|
| [Claude Code](https://claude.com/product/claude-code) | `claude` |
|
|
154
186
|
| [Cursor](https://www.cursor.com/) | `cursor` |
|
|
155
187
|
| [GitHub Copilot](https://github.com/features/copilot/cli) | `copilot` |
|
|
156
|
-
| [Google Gemini](https://geminicli.com/) | `gemini` |
|
|
157
188
|
| [OpenAI Codex](https://developers.openai.com/codex/cli/) | `codex` |
|
|
158
189
|
| [OpenCode](https://opencode.ai/) | `opencode` |
|
|
159
190
|
| [VS Code](https://github.com/features/copilot/ai-code-editor) | `code` |
|
|
160
|
-
| [Antigravity](https://antigravity.google/) | `antigravity` |
|
|
191
|
+
| [Antigravity IDE](https://antigravity.google/) | `antigravity` |
|
|
192
|
+
| [Antigravity CLI](https://antigravity.google/) | `agy` |
|
|
193
|
+
|
|
194
|
+
> In `.wade.yml`, refer to a tool by its **config ID**, which matches the binary
|
|
195
|
+
> above except for VS Code (`vscode`) and Antigravity CLI (`antigravity-cli`).
|
|
196
|
+
> Antigravity IDE (config ID `antigravity`) is launch-only — WADE opens your
|
|
197
|
+
> workspace in the desktop app; its workflow files are provisioned via the
|
|
198
|
+
> Antigravity CLI's shared `.agents/` layout.
|
|
161
199
|
|
|
162
200
|
## Task Providers
|
|
163
201
|
|