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.
Files changed (294) hide show
  1. {wade_cli-0.30.2 → wade_cli-0.35.0}/.wade.yml +22 -23
  2. {wade_cli-0.30.2 → wade_cli-0.35.0}/AGENTS.md +1 -1
  3. {wade_cli-0.30.2 → wade_cli-0.35.0}/CHANGELOG.md +54 -0
  4. wade_cli-0.35.0/KNOWLEDGE.md +233 -0
  5. wade_cli-0.35.0/KNOWLEDGE.ratings.yml +94 -0
  6. {wade_cli-0.30.2 → wade_cli-0.35.0}/PKG-INFO +44 -6
  7. {wade_cli-0.30.2 → wade_cli-0.35.0}/README.md +42 -4
  8. {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/architecture.md +9 -7
  9. {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/skills-system.md +2 -3
  10. {wade_cli-0.30.2 → wade_cli-0.35.0}/pyproject.toml +2 -2
  11. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/__init__.py +1 -1
  12. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/autocomplete.py +8 -0
  13. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/main.py +54 -4
  14. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/review.py +9 -1
  15. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/loader.py +31 -0
  16. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/hooks/plan_write_guard.py +4 -5
  17. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/hooks/worktree_guard.py +4 -5
  18. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/config.py +39 -6
  19. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/delegation.py +4 -2
  20. wade_cli-0.35.0/src/wade/models/permission.py +78 -0
  21. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/task.py +12 -0
  22. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/base.py +6 -3
  23. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/clickup.py +7 -2
  24. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/github.py +8 -4
  25. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/markdown.py +5 -1
  26. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/ai_resolution.py +116 -55
  27. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/check_service.py +51 -12
  28. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/delegation_service.py +9 -21
  29. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/deps_service.py +4 -0
  30. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/__init__.py +6 -0
  31. wade_cli-0.35.0/src/wade/services/implementation_service/_shared.py +55 -0
  32. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/batch.py +17 -8
  33. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/bootstrap.py +2 -12
  34. wade_cli-0.35.0/src/wade/services/implementation_service/cleanup.py +370 -0
  35. wade_cli-0.35.0/src/wade/services/implementation_service/core.py +789 -0
  36. wade_cli-0.35.0/src/wade/services/implementation_service/done.py +488 -0
  37. wade_cli-0.35.0/src/wade/services/implementation_service/draft_pr.py +191 -0
  38. wade_cli-0.35.0/src/wade/services/implementation_service/lifecycle.py +472 -0
  39. wade_cli-0.35.0/src/wade/services/implementation_service/sync.py +722 -0
  40. wade_cli-0.35.0/src/wade/services/init_service/__init__.py +16 -0
  41. wade_cli-0.35.0/src/wade/services/init_service/auth.py +96 -0
  42. wade_cli-0.35.0/src/wade/services/init_service/commands.py +707 -0
  43. wade_cli-0.35.0/src/wade/services/init_service/config_io.py +516 -0
  44. wade_cli-0.35.0/src/wade/services/init_service/manifest.py +146 -0
  45. wade_cli-0.35.0/src/wade/services/init_service/migrations.py +354 -0
  46. wade_cli-0.35.0/src/wade/services/init_service/prompts_ai.py +339 -0
  47. wade_cli-0.35.0/src/wade/services/init_service/prompts_setup.py +694 -0
  48. wade_cli-0.35.0/src/wade/services/init_service/shell.py +185 -0
  49. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/plan_service.py +138 -35
  50. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/prompt_delivery.py +1 -1
  51. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/review_delegation_service.py +1 -0
  52. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/review_service.py +33 -24
  53. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/smart_start.py +15 -2
  54. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/skills/installer.py +1 -6
  55. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/ui/console.py +2 -1
  56. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/install.py +23 -1
  57. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/implementation-session/SKILL.md +1 -1
  58. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_implement_work_done_contract.py +1 -1
  59. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_autostash.py +9 -9
  60. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_implementation_lifecycle.py +15 -7
  61. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_skill_install.py +2 -2
  62. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/test_wade_live_ai_taskr.py +0 -1
  63. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_effort.py +13 -5
  64. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_hooks/test_plan_write_guard.py +1 -1
  65. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_hooks/test_worktree_guard.py +1 -1
  66. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_delegation.py +5 -4
  67. wade_cli-0.35.0/tests/unit/test_permission_mode.py +436 -0
  68. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_clickup.py +14 -0
  69. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_github.py +22 -0
  70. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_markdown.py +9 -0
  71. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_ai_resolution.py +22 -6
  72. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_bootstrap_allowlist.py +1 -8
  73. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_catchup.py +28 -28
  74. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_check.py +8 -0
  75. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_delegation_service.py +55 -6
  76. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_deps_service.py +54 -1
  77. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_done_plan_flag.py +12 -12
  78. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_done_via_direct_cleanup.py +27 -27
  79. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_implementation_done_sync.py +194 -90
  80. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_implementation_service.py +97 -40
  81. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_init.py +166 -88
  82. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_init_shell_integration.py +14 -14
  83. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_plan_service.py +354 -4
  84. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_post_implementation_lifecycle.py +52 -52
  85. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_pr_summary_path.py +8 -8
  86. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_preserve_session_data.py +16 -16
  87. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_prompt_delivery.py +1 -1
  88. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_review_service.py +12 -12
  89. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_smart_start.py +4 -2
  90. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_smart_start_resume.py +1 -1
  91. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_sync_base_branch.py +12 -12
  92. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_install.py +45 -0
  93. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_markdown.py +1 -1
  94. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_yolo.py +78 -174
  95. wade_cli-0.30.2/KNOWLEDGE.md +0 -131
  96. wade_cli-0.30.2/KNOWLEDGE.ratings.yml +0 -30
  97. wade_cli-0.30.2/src/wade/services/implementation_service/core.py +0 -2869
  98. wade_cli-0.30.2/src/wade/services/init_service.py +0 -2770
  99. wade_cli-0.30.2/tests/fixtures/transcripts/gemini_session.txt +0 -30
  100. {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/auto-version.yml +0 -0
  101. {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/ci.yml +0 -0
  102. {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/pr-title-lint.yml +0 -0
  103. {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/publish.yml +0 -0
  104. {wade_cli-0.30.2 → wade_cli-0.35.0}/.github/workflows/release.yml +0 -0
  105. {wade_cli-0.30.2 → wade_cli-0.35.0}/.gitignore +0 -0
  106. {wade_cli-0.30.2 → wade_cli-0.35.0}/.pre-commit-config.yaml +0 -0
  107. {wade_cli-0.30.2 → wade_cli-0.35.0}/CONTRIBUTING.md +0 -0
  108. {wade_cli-0.30.2 → wade_cli-0.35.0}/assets/wade.png +0 -0
  109. {wade_cli-0.30.2 → wade_cli-0.35.0}/docker-compose.e2e.yml +0 -0
  110. {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/documentation-policies.md +0 -0
  111. {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/extending.md +0 -0
  112. {wade_cli-0.30.2 → wade_cli-0.35.0}/docs/dev/testing.md +0 -0
  113. {wade_cli-0.30.2 → wade_cli-0.35.0}/install.sh +0 -0
  114. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/auto_version.py +0 -0
  115. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/changelog.py +0 -0
  116. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/check-all.sh +0 -0
  117. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/check.sh +0 -0
  118. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/fmt.sh +0 -0
  119. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/hooks/pre-push +0 -0
  120. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/install-hooks.sh +0 -0
  121. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/release.sh +0 -0
  122. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/setup-worktree.sh +0 -0
  123. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-e2e-docker.sh +0 -0
  124. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-e2e.sh +0 -0
  125. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-live-ai-taskr.sh +0 -0
  126. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-live-ai.sh +0 -0
  127. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test-live-gh.sh +0 -0
  128. {wade_cli-0.30.2 → wade_cli-0.35.0}/scripts/test.sh +0 -0
  129. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/__main__.py +0 -0
  130. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/__init__.py +0 -0
  131. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/admin.py +0 -0
  132. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/implementation_session.py +0 -0
  133. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/knowledge.py +0 -0
  134. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/plan_session.py +0 -0
  135. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/review_pr_comments_session.py +0 -0
  136. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/session_shared.py +0 -0
  137. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/task.py +0 -0
  138. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/cli/worktree.py +0 -0
  139. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/__init__.py +0 -0
  140. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/migrations.py +0 -0
  141. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/config/schema.py +0 -0
  142. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/__init__.py +0 -0
  143. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/engine.py +0 -0
  144. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/repositories.py +0 -0
  145. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/db/tables.py +0 -0
  146. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/__init__.py +0 -0
  147. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/branch.py +0 -0
  148. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/pr.py +0 -0
  149. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/repo.py +0 -0
  150. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/stash.py +0 -0
  151. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/sync.py +0 -0
  152. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/git/worktree.py +0 -0
  153. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/hooks/__init__.py +0 -0
  154. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/logging/__init__.py +0 -0
  155. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/logging/context.py +0 -0
  156. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/logging/setup.py +0 -0
  157. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/__init__.py +0 -0
  158. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/batch.py +0 -0
  159. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/deps.py +0 -0
  160. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/events.py +0 -0
  161. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/review.py +0 -0
  162. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/models/session.py +0 -0
  163. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/__init__.py +0 -0
  164. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/_pr_delegate.py +0 -0
  165. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/providers/registry.py +0 -0
  166. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/__init__.py +0 -0
  167. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/batch_review_service.py +0 -0
  168. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/implementation_service/usage_tracking.py +0 -0
  169. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/knowledge_search.py +0 -0
  170. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/knowledge_service.py +0 -0
  171. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/review_settle.py +0 -0
  172. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/services/task_service.py +0 -0
  173. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/skills/__init__.py +0 -0
  174. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/skills/pointer.py +0 -0
  175. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/ui/__init__.py +0 -0
  176. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/ui/prompts.py +0 -0
  177. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/__init__.py +0 -0
  178. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/clipboard.py +0 -0
  179. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/http.py +0 -0
  180. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/markdown.py +0 -0
  181. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/process.py +0 -0
  182. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/slug.py +0 -0
  183. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/terminal.py +0 -0
  184. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/token_usage_markdown.py +0 -0
  185. {wade_cli-0.30.2 → wade_cli-0.35.0}/src/wade/utils/update_check.py +0 -0
  186. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/agents-pointer.md +0 -0
  187. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/deps-analysis.md +0 -0
  188. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/implement-context.md +0 -0
  189. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/plan-session.md +0 -0
  190. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-batch.md +0 -0
  191. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-code.md +0 -0
  192. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-plan.md +0 -0
  193. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/prompts/review-pr-comments.md +0 -0
  194. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/setup-worktree.sh.example +0 -0
  195. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/review-enforcement-rule.md +0 -0
  196. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/review-implementation-closing-step.md +0 -0
  197. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/review-plan-step.md +0 -0
  198. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/_partials/user-interaction.md +0 -0
  199. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/deps/SKILL.md +0 -0
  200. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/knowledge/SKILL.md +0 -0
  201. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/plan-session/SKILL.md +0 -0
  202. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/review-pr-comments-session/SKILL.md +0 -0
  203. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/task/SKILL.md +0 -0
  204. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/task/examples.md +0 -0
  205. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/skills/task/plan-format.md +0 -0
  206. {wade_cli-0.30.2 → wade_cli-0.35.0}/templates/statusline-command.sh +0 -0
  207. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/__init__.py +0 -0
  208. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/conftest.py +0 -0
  209. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/__init__.py +0 -0
  210. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/_support.py +0 -0
  211. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/conftest.py +0 -0
  212. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/mock_gh_script.py +0 -0
  213. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_admin_contract.py +0 -0
  214. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_check_contract.py +0 -0
  215. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_knowledge_contract.py +0 -0
  216. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_mock_gh_contract.py +0 -0
  217. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_plan_contract.py +0 -0
  218. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_review_contract.py +0 -0
  219. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_smart_start_contract.py +0 -0
  220. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_task_contract.py +0 -0
  221. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/e2e/test_work_sync_list_contract.py +0 -0
  222. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
  223. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
  224. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/claude_session.txt +0 -0
  225. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/codex_session.txt +0 -0
  226. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/copilot_session.txt +0 -0
  227. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/fixtures/transcripts/generic_session.txt +0 -0
  228. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/__init__.py +0 -0
  229. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_check.py +0 -0
  230. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_git.py +0 -0
  231. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_init.py +0 -0
  232. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_knowledge.py +0 -0
  233. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/integration/test_markdown_provider.py +0 -0
  234. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/__init__.py +0 -0
  235. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/test_wade_live_ai.py +0 -0
  236. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/live/test_wade_live_gh.py +0 -0
  237. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/test_cli_basics.py +0 -0
  238. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/__init__.py +0 -0
  239. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/conftest.py +0 -0
  240. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/__init__.py +0 -0
  241. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_done_review_hint.py +0 -0
  242. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
  243. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_review_cli.py +0 -0
  244. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_session_subapps.py +0 -0
  245. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_shell_init.py +0 -0
  246. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_task_cli.py +0 -0
  247. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
  248. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_cli/test_work_cli.py +0 -0
  249. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/__init__.py +0 -0
  250. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/test_loader.py +0 -0
  251. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/test_migrations.py +0 -0
  252. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_config/test_migrations_atomic.py +0 -0
  253. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_console.py +0 -0
  254. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_db/__init__.py +0 -0
  255. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_db/test_repository_transactions.py +0 -0
  256. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/__init__.py +0 -0
  257. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_branch_slugify.py +0 -0
  258. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_detached_worktree.py +0 -0
  259. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_pr_base.py +0 -0
  260. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_repo.py +0 -0
  261. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_scaffold_commit.py +0 -0
  262. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
  263. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_git/test_worktree_remove.py +0 -0
  264. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_hooks/__init__.py +0 -0
  265. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/__init__.py +0 -0
  266. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_batch.py +0 -0
  267. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_config_models.py +0 -0
  268. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_db.py +0 -0
  269. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_deps_models.py +0 -0
  270. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_deps_partition.py +0 -0
  271. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_review.py +0 -0
  272. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_models/test_task_models.py +0 -0
  273. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/__init__.py +0 -0
  274. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_providers/test_github_pr.py +0 -0
  275. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/__init__.py +0 -0
  276. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_batch_review_service.py +0 -0
  277. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
  278. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
  279. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_knowledge_search.py +0 -0
  280. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_knowledge_service.py +0 -0
  281. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
  282. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_review_delegation_service.py +0 -0
  283. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_task_service.py +0 -0
  284. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
  285. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
  286. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
  287. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/__init__.py +0 -0
  288. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_http.py +0 -0
  289. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_process.py +0 -0
  290. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_prompts.py +0 -0
  291. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_slug.py +0 -0
  292. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_terminal.py +0 -0
  293. {wade_cli-0.30.2 → wade_cli-0.35.0}/tests/unit/test_utils/test_terminal_launch.py +0 -0
  294. {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-sonnet-4.6
11
- effort: max
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: copilot
19
- model: claude-sonnet-4.6
16
+ tool: claude
17
+ model: claude-sonnet-5
20
18
  mode: headless
21
- yolo: false
19
+ effort: high
22
20
  review_plan:
23
- tool: copilot
24
- model: claude-sonnet-4.6
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: copilot
30
- model: claude-sonnet-4.6
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: copilot
36
- model: claude-sonnet-4.6
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: true
39
+ yolo: false
41
40
  models:
42
41
  claude:
43
42
  easy:
44
- model: claude-sonnet-4.6
45
- effort: xhigh
46
- medium:
47
- model: claude-sonnet-4.6
43
+ model: claude-haiku-4.5
48
44
  effort: max
49
- complex:
50
- model: claude-opus-4.7
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.7
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, Gemini, Codex, OpenCode, Antigravity, 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.
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.30.2
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.4.0,>=0.3.1
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`, `Gemini`, `Codex`, and more. Run `wade init` once per project, then just point it at a GitHub *(more to come!)* issue number.
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`, `Gemini`, `Codex`, and more. Run `wade init` once per project, then just point it at a GitHub *(more to come!)* issue number.
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