wade-cli 0.50.2__tar.gz → 0.50.4__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 (375) hide show
  1. {wade_cli-0.50.2 → wade_cli-0.50.4}/.github/workflows/release.yml +2 -6
  2. {wade_cli-0.50.2 → wade_cli-0.50.4}/CHANGELOG.md +12 -0
  3. {wade_cli-0.50.2 → wade_cli-0.50.4}/PKG-INFO +2 -2
  4. {wade_cli-0.50.2 → wade_cli-0.50.4}/pyproject.toml +2 -2
  5. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/__init__.py +1 -1
  6. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_hooks/test_hook_cli.py +76 -4
  7. {wade_cli-0.50.2 → wade_cli-0.50.4}/.gitattributes +0 -0
  8. {wade_cli-0.50.2 → wade_cli-0.50.4}/.github/workflows/auto-version.yml +0 -0
  9. {wade_cli-0.50.2 → wade_cli-0.50.4}/.github/workflows/ci.yml +0 -0
  10. {wade_cli-0.50.2 → wade_cli-0.50.4}/.github/workflows/pr-title-lint.yml +0 -0
  11. {wade_cli-0.50.2 → wade_cli-0.50.4}/.github/workflows/publish.yml +0 -0
  12. {wade_cli-0.50.2 → wade_cli-0.50.4}/.gitignore +0 -0
  13. {wade_cli-0.50.2 → wade_cli-0.50.4}/.pre-commit-config.yaml +0 -0
  14. {wade_cli-0.50.2 → wade_cli-0.50.4}/.wade.yml +0 -0
  15. {wade_cli-0.50.2 → wade_cli-0.50.4}/AGENTS.md +0 -0
  16. {wade_cli-0.50.2 → wade_cli-0.50.4}/CONTRIBUTING.md +0 -0
  17. {wade_cli-0.50.2 → wade_cli-0.50.4}/KNOWLEDGE.md +0 -0
  18. {wade_cli-0.50.2 → wade_cli-0.50.4}/KNOWLEDGE.ratings.jsonl +0 -0
  19. {wade_cli-0.50.2 → wade_cli-0.50.4}/README.md +0 -0
  20. {wade_cli-0.50.2 → wade_cli-0.50.4}/assets/wade.png +0 -0
  21. {wade_cli-0.50.2 → wade_cli-0.50.4}/docker-compose.e2e.yml +0 -0
  22. {wade_cli-0.50.2 → wade_cli-0.50.4}/docs/dev/architecture.md +0 -0
  23. {wade_cli-0.50.2 → wade_cli-0.50.4}/docs/dev/documentation-policies.md +0 -0
  24. {wade_cli-0.50.2 → wade_cli-0.50.4}/docs/dev/extending.md +0 -0
  25. {wade_cli-0.50.2 → wade_cli-0.50.4}/docs/dev/skills-system.md +0 -0
  26. {wade_cli-0.50.2 → wade_cli-0.50.4}/docs/dev/testing.md +0 -0
  27. {wade_cli-0.50.2 → wade_cli-0.50.4}/install.sh +0 -0
  28. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/auto_version.py +0 -0
  29. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/changelog.py +0 -0
  30. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/check-all.sh +0 -0
  31. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/check.sh +0 -0
  32. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/fmt.sh +0 -0
  33. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/hooks/pre-push +0 -0
  34. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/install-hooks.sh +0 -0
  35. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/release.sh +0 -0
  36. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/setup-worktree.sh +0 -0
  37. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test-concurrency.sh +0 -0
  38. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test-e2e-docker.sh +0 -0
  39. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test-e2e.sh +0 -0
  40. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test-live-ai-taskr.sh +0 -0
  41. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test-live-ai.sh +0 -0
  42. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test-live-gh.sh +0 -0
  43. {wade_cli-0.50.2 → wade_cli-0.50.4}/scripts/test.sh +0 -0
  44. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/__main__.py +0 -0
  45. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/__init__.py +0 -0
  46. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/admin.py +0 -0
  47. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/autocomplete.py +0 -0
  48. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/hook.py +0 -0
  49. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/implementation_session.py +0 -0
  50. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/knowledge.py +0 -0
  51. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/main.py +0 -0
  52. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/plan_session.py +0 -0
  53. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/review.py +0 -0
  54. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/review_pr_comments_session.py +0 -0
  55. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/session_shared.py +0 -0
  56. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/task.py +0 -0
  57. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/cli/worktree.py +0 -0
  58. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/config/__init__.py +0 -0
  59. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/config/loader.py +0 -0
  60. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/config/migrations.py +0 -0
  61. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/config/schema.py +0 -0
  62. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/__init__.py +0 -0
  63. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/branch.py +0 -0
  64. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/hooks.py +0 -0
  65. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/pr.py +0 -0
  66. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/repo.py +0 -0
  67. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/stash.py +0 -0
  68. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/sync.py +0 -0
  69. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/git/worktree.py +0 -0
  70. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/hooks/__init__.py +0 -0
  71. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/hooks/cli.py +0 -0
  72. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/hooks/policies.py +0 -0
  73. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/logging/__init__.py +0 -0
  74. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/logging/context.py +0 -0
  75. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/logging/setup.py +0 -0
  76. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/__init__.py +0 -0
  77. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/batch.py +0 -0
  78. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/config.py +0 -0
  79. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/delegation.py +0 -0
  80. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/deps.py +0 -0
  81. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/events.py +0 -0
  82. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/hooks.py +0 -0
  83. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/permission.py +0 -0
  84. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/review.py +0 -0
  85. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/session.py +0 -0
  86. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/task.py +0 -0
  87. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/models/worktree.py +0 -0
  88. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/__init__.py +0 -0
  89. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/_pr_delegate.py +0 -0
  90. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/base.py +0 -0
  91. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/clickup.py +0 -0
  92. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/github.py +0 -0
  93. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/markdown.py +0 -0
  94. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/providers/registry.py +0 -0
  95. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/__init__.py +0 -0
  96. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/ai_resolution.py +0 -0
  97. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/batch_review_service.py +0 -0
  98. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/check_service.py +0 -0
  99. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/delegation_service.py +0 -0
  100. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/deps_service.py +0 -0
  101. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/__init__.py +0 -0
  102. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/_shared.py +0 -0
  103. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/batch.py +0 -0
  104. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/bootstrap.py +0 -0
  105. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/cleanup.py +0 -0
  106. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/core.py +0 -0
  107. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/done.py +0 -0
  108. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/draft_pr.py +0 -0
  109. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/lifecycle.py +0 -0
  110. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/sync.py +0 -0
  111. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/implementation_service/usage_tracking.py +0 -0
  112. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/__init__.py +0 -0
  113. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/auth.py +0 -0
  114. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/commands.py +0 -0
  115. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/config_io.py +0 -0
  116. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/manifest.py +0 -0
  117. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/migrations.py +0 -0
  118. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/prompts_ai.py +0 -0
  119. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/prompts_setup.py +0 -0
  120. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/init_service/shell.py +0 -0
  121. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/knowledge_search.py +0 -0
  122. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/knowledge_service.py +0 -0
  123. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/plan_service.py +0 -0
  124. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/prompt_delivery.py +0 -0
  125. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/review_delegation_service.py +0 -0
  126. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/review_service.py +0 -0
  127. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/review_settle.py +0 -0
  128. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/smart_start.py +0 -0
  129. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/services/task_service.py +0 -0
  130. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/skills/__init__.py +0 -0
  131. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/skills/doc_targets.py +0 -0
  132. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/skills/installer.py +0 -0
  133. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/skills/pointer.py +0 -0
  134. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/ui/__init__.py +0 -0
  135. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/ui/console.py +0 -0
  136. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/ui/prompts.py +0 -0
  137. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/__init__.py +0 -0
  138. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/body_markers.py +0 -0
  139. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/clipboard.py +0 -0
  140. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/conventional.py +0 -0
  141. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/filelock.py +0 -0
  142. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/gitref.py +0 -0
  143. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/http.py +0 -0
  144. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/install.py +0 -0
  145. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/knowledge_file.py +0 -0
  146. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/markdown.py +0 -0
  147. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/markers.py +0 -0
  148. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/paths.py +0 -0
  149. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/plan_validation.py +0 -0
  150. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/process.py +0 -0
  151. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/slug.py +0 -0
  152. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/stale_base.py +0 -0
  153. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/templates.py +0 -0
  154. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/terminal.py +0 -0
  155. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/token_usage_markdown.py +0 -0
  156. {wade_cli-0.50.2 → wade_cli-0.50.4}/src/wade/utils/update_check.py +0 -0
  157. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/agents-pointer.md +0 -0
  158. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/hooks/commit-msg +0 -0
  159. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/hooks/pre-commit +0 -0
  160. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/hooks/pre-push +0 -0
  161. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/deps-analysis.md +0 -0
  162. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/implement-context.md +0 -0
  163. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/plan-session.md +0 -0
  164. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/review-batch.md +0 -0
  165. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/review-code.md +0 -0
  166. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/review-plan.md +0 -0
  167. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/review-pr-comments.md +0 -0
  168. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/session-start-implement.md +0 -0
  169. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/session-start-plan.md +0 -0
  170. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/prompts/session-start-review.md +0 -0
  171. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/setup-worktree.sh.example +0 -0
  172. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/doc-update-step.md +0 -0
  173. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/knowledge-step.md +0 -0
  174. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/review-budget.md +0 -0
  175. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/review-enforcement-rule.md +0 -0
  176. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/review-implementation-closing-step.md +0 -0
  177. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/review-plan-step.md +0 -0
  178. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/_partials/user-interaction.md +0 -0
  179. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/deps/SKILL.md +0 -0
  180. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/implementation-session/SKILL.md +0 -0
  181. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/implementation-session/reference/doc-update.md +0 -0
  182. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/implementation-session/reference/new-plan.md +0 -0
  183. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/implementation-session/reference/pr-summary-format.md +0 -0
  184. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/implementation-session/reference/recovery.md +0 -0
  185. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/implementation-session/reference/tracking-issues.md +0 -0
  186. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/knowledge/SKILL.md +0 -0
  187. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/plan-session/SKILL.md +0 -0
  188. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/plan-session/reference/plan-format.md +0 -0
  189. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/review-pr-comments-session/SKILL.md +0 -0
  190. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/review-pr-comments-session/reference/doc-update.md +0 -0
  191. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/review-pr-comments-session/reference/recovery.md +0 -0
  192. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/task/SKILL.md +0 -0
  193. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/task/examples.md +0 -0
  194. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/task/plan-format.md +0 -0
  195. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/skills/task/reference/session-summary-format.md +0 -0
  196. {wade_cli-0.50.2 → wade_cli-0.50.4}/templates/statusline-command.sh +0 -0
  197. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/__init__.py +0 -0
  198. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/concurrency/__init__.py +0 -0
  199. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/concurrency/test_batch_multi_pr.py +0 -0
  200. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/concurrency/test_knowledge_merge.py +0 -0
  201. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/concurrency/test_lock_retry.py +0 -0
  202. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/concurrency/test_stash_race.py +0 -0
  203. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/conftest.py +0 -0
  204. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/__init__.py +0 -0
  205. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/_support.py +0 -0
  206. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/conftest.py +0 -0
  207. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/mock_gh_script.py +0 -0
  208. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_admin_contract.py +0 -0
  209. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_check_contract.py +0 -0
  210. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_implement_work_done_contract.py +0 -0
  211. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_knowledge_contract.py +0 -0
  212. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_mock_gh_contract.py +0 -0
  213. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_plan_contract.py +0 -0
  214. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_review_contract.py +0 -0
  215. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_smart_start_contract.py +0 -0
  216. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_task_contract.py +0 -0
  217. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/e2e/test_work_sync_list_contract.py +0 -0
  218. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
  219. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
  220. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/fixtures/transcripts/claude_session.txt +0 -0
  221. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/fixtures/transcripts/codex_session.txt +0 -0
  222. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/fixtures/transcripts/copilot_session.txt +0 -0
  223. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/fixtures/transcripts/generic_session.txt +0 -0
  224. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/__init__.py +0 -0
  225. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_autostash.py +0 -0
  226. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_check.py +0 -0
  227. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_git.py +0 -0
  228. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_implementation_lifecycle.py +0 -0
  229. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_init.py +0 -0
  230. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_knowledge.py +0 -0
  231. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_markdown_provider.py +0 -0
  232. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_skill_context_budget.py +0 -0
  233. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/integration/test_skill_install.py +0 -0
  234. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/live/__init__.py +0 -0
  235. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/live/test_wade_live_ai.py +0 -0
  236. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/live/test_wade_live_ai_taskr.py +0 -0
  237. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/live/test_wade_live_gh.py +0 -0
  238. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/test_cli_basics.py +0 -0
  239. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/__init__.py +0 -0
  240. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/conftest.py +0 -0
  241. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/__init__.py +0 -0
  242. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_done_doc_pass_advisory.py +0 -0
  243. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_done_review_hint.py +0 -0
  244. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
  245. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_review_cli.py +0 -0
  246. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_session_subapps.py +0 -0
  247. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_shell_init.py +0 -0
  248. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_task_cli.py +0 -0
  249. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
  250. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_cli/test_work_cli.py +0 -0
  251. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_config/__init__.py +0 -0
  252. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_config/test_bot_review_config.py +0 -0
  253. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_config/test_loader.py +0 -0
  254. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_config/test_merge_strategy_migration.py +0 -0
  255. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_config/test_migrations.py +0 -0
  256. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_config/test_migrations_atomic.py +0 -0
  257. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_console.py +0 -0
  258. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_effort.py +0 -0
  259. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/__init__.py +0 -0
  260. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_all_patches_present.py +0 -0
  261. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_branch_list.py +0 -0
  262. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_branch_slugify.py +0 -0
  263. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_detached_worktree.py +0 -0
  264. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_is_merged_into.py +0 -0
  265. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_main_checkout_root.py +0 -0
  266. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_merge_count.py +0 -0
  267. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_pr_base.py +0 -0
  268. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_pr_lookup.py +0 -0
  269. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_pr_retry.py +0 -0
  270. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_pr_title.py +0 -0
  271. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_repo.py +0 -0
  272. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_reset_branch.py +0 -0
  273. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_scaffold_commit.py +0 -0
  274. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_stash_drop.py +0 -0
  275. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
  276. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_tip_commit_is_empty.py +0 -0
  277. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_git/test_worktree_remove.py +0 -0
  278. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_hooks/__init__.py +0 -0
  279. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_hooks/test_policies.py +0 -0
  280. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_hooks/test_post_tool_use.py +0 -0
  281. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_hooks/test_session_start.py +0 -0
  282. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/__init__.py +0 -0
  283. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_batch.py +0 -0
  284. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_config_models.py +0 -0
  285. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_delegation.py +0 -0
  286. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_deps_models.py +0 -0
  287. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_deps_partition.py +0 -0
  288. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_review.py +0 -0
  289. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_review_expectation.py +0 -0
  290. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_models/test_task_models.py +0 -0
  291. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_permission_mode.py +0 -0
  292. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_providers/__init__.py +0 -0
  293. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_providers/test_clickup.py +0 -0
  294. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_providers/test_github.py +0 -0
  295. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_providers/test_github_pr.py +0 -0
  296. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_providers/test_markdown.py +0 -0
  297. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/__init__.py +0 -0
  298. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_ai_resolution.py +0 -0
  299. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_batch_build_cmd.py +0 -0
  300. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_batch_pr_index.py +0 -0
  301. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_batch_review_service.py +0 -0
  302. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_bootstrap_allowlist.py +0 -0
  303. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
  304. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_bootstrap_post_tool_use.py +0 -0
  305. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_bootstrap_pre_push.py +0 -0
  306. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_bootstrap_session_start.py +0 -0
  307. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_bot_trigger.py +0 -0
  308. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_catchup.py +0 -0
  309. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_catchup_reconcile.py +0 -0
  310. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_check.py +0 -0
  311. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_cleanup_loss_guard.py +0 -0
  312. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_codex_worktree_launch_context.py +0 -0
  313. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_delegation_service.py +0 -0
  314. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_deps_service.py +0 -0
  315. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_done_gates.py +0 -0
  316. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_done_idempotent.py +0 -0
  317. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_done_plan_flag.py +0 -0
  318. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_done_pr_title_sync.py +0 -0
  319. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_draft_pr_base_fetch.py +0 -0
  320. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_draft_pr_retarget.py +0 -0
  321. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_implementation_done_sync.py +0 -0
  322. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_implementation_launch_context.py +0 -0
  323. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_implementation_service.py +0 -0
  324. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
  325. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_init.py +0 -0
  326. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_init_shell_integration.py +0 -0
  327. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_knowledge_search.py +0 -0
  328. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_knowledge_service.py +0 -0
  329. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_managed_git_hooks.py +0 -0
  330. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_no_direct_git.py +0 -0
  331. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_plan_service.py +0 -0
  332. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
  333. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_post_implementation_lifecycle.py +0 -0
  334. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_pr_lookup_guards.py +0 -0
  335. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_pr_summary_path.py +0 -0
  336. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_pre_push_backstop.py +0 -0
  337. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_preserve_session_data.py +0 -0
  338. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_prompt_delivery.py +0 -0
  339. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_push_recovery.py +0 -0
  340. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_resolve_task_branch.py +0 -0
  341. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_resume_autonomy.py +0 -0
  342. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_review_delegation_service.py +0 -0
  343. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_review_service.py +0 -0
  344. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_review_status_block.py +0 -0
  345. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_reviewed_marker.py +0 -0
  346. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_smart_start.py +0 -0
  347. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_smart_start_resume.py +0 -0
  348. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_stale_base_surface.py +0 -0
  349. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_sync_base_branch.py +0 -0
  350. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_task_service.py +0 -0
  351. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
  352. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
  353. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_skills/test_doc_targets.py +0 -0
  354. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_skills/test_knowledge_attributes.py +0 -0
  355. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
  356. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_skills/test_pointer.py +0 -0
  357. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_skills/test_review_budget_partial.py +0 -0
  358. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/__init__.py +0 -0
  359. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_body_markers.py +0 -0
  360. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_conventional.py +0 -0
  361. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_filelock.py +0 -0
  362. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_gitref.py +0 -0
  363. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_http.py +0 -0
  364. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_install.py +0 -0
  365. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_markdown.py +0 -0
  366. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_markers.py +0 -0
  367. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_plan_validation.py +0 -0
  368. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_process.py +0 -0
  369. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_prompts.py +0 -0
  370. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_slug.py +0 -0
  371. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_stale_base.py +0 -0
  372. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_terminal.py +0 -0
  373. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_terminal_launch.py +0 -0
  374. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_utils/test_update_check.py +0 -0
  375. {wade_cli-0.50.2 → wade_cli-0.50.4}/tests/unit/test_yolo.py +0 -0
@@ -15,13 +15,9 @@ jobs:
15
15
  fetch-depth: 0
16
16
 
17
17
  - name: Extract changelog section
18
- id: changelog
19
18
  run: |
20
19
  VERSION="${GITHUB_REF_NAME}"
21
- NOTES=$(awk "/^## \[${VERSION}\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md)
22
- echo "notes<<EOF" >> $GITHUB_OUTPUT
23
- echo "$NOTES" >> $GITHUB_OUTPUT
24
- echo "EOF" >> $GITHUB_OUTPUT
20
+ awk "/^## \[${VERSION}\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md > release_notes.md
25
21
 
26
22
  - name: Create draft release
27
23
  env:
@@ -30,4 +26,4 @@ jobs:
30
26
  gh release create "$GITHUB_REF_NAME" \
31
27
  --draft \
32
28
  --title "$GITHUB_REF_NAME" \
33
- --notes "${{ steps.changelog.outputs.notes }}"
29
+ --notes-file release_notes.md
@@ -4,6 +4,18 @@ 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.50.4] — 2026-08-19
8
+
9
+ ### Chores
10
+
11
+ - bump crossby to adopt the Antigravity CLI hook-contract fix (#456) (5cb582c)
12
+
13
+ ## [v0.50.3] — 2026-08-19
14
+
15
+ ### Bug Fixes
16
+
17
+ - pass changelog notes to gh release create via file, not inline template (1776e0d)
18
+
7
19
  ## [v0.50.2] — 2026-08-19
8
20
 
9
21
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: wade-cli
3
- Version: 0.50.2
3
+ Version: 0.50.4
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.25.0,>=0.24.3
19
+ Requires-Dist: crossby<0.25.0,>=0.24.4
20
20
  Requires-Dist: httpx<1.0,>=0.27
21
21
  Requires-Dist: pydantic-settings>=2.0
22
22
  Requires-Dist: pydantic>=2.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "wade-cli"
7
- version = "0.50.2"
7
+ version = "0.50.4"
8
8
  description = "WADE — Workflow for AI-Driven Engineering"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -24,7 +24,7 @@ classifiers = [
24
24
  "Topic :: Software Development :: Version Control :: Git",
25
25
  ]
26
26
  dependencies = [
27
- "crossby>=0.24.3,<0.25.0",
27
+ "crossby>=0.24.4,<0.25.0",
28
28
  "typer>=0.12,<0.26",
29
29
  "pydantic>=2.0",
30
30
  "pydantic-settings>=2.0",
@@ -1,3 +1,3 @@
1
1
  """WADE (Workflow for AI-Driven Engineering) — AI-agent-driven git workflow management CLI."""
2
2
 
3
- __version__ = "0.50.2"
3
+ __version__ = "0.50.4"
@@ -96,8 +96,11 @@ class TestWorktreeGuardCLI:
96
96
  "antigravity-cli",
97
97
  json.dumps({"tool_name": "Write", "tool_input": {"path": "/etc/passwd"}}),
98
98
  )
99
- assert r.returncode == 2
100
- # DECISION dialect: agy blocks via a top-level {"decision": "deny"}.
99
+ # DECISION dialect: agy reads the block from the top-level
100
+ # {"decision": "deny"} body, not the exit code — so the process exits 0
101
+ # even on a deny (crossby >= 0.24.4; see crossby#147). The decision field,
102
+ # not the exit code, is the contract.
103
+ assert r.returncode == 0
101
104
  assert json.loads(r.stdout)["decision"] == "deny"
102
105
  assert "BLOCKED" in r.stderr
103
106
 
@@ -520,8 +523,74 @@ class TestShellGuardCLI:
520
523
  "antigravity-cli",
521
524
  json.dumps({"toolCall": {"name": "run_command", "args": {"command": "cp a /etc/x"}}}),
522
525
  )
523
- assert r.returncode == 2
526
+ # agy signals the block via the decision body, not the exit code (exit 0).
527
+ assert r.returncode == 0
528
+ assert json.loads(r.stdout)["decision"] == "deny"
529
+
530
+
531
+ class TestAntigravityPascalCaseDialect:
532
+ """Pin the agy PascalCase tool-arg dialect at the wade-hook boundary.
533
+
534
+ agy nests tool args under ``toolCall.args`` and names them in PascalCase
535
+ (``TargetFile``/``CommandLine``), and it reads the guard verdict from a
536
+ top-level ``{"decision": ...}`` body (never the exit code). Before crossby
537
+ 0.24.4 (crossby#147) those args went unread, so every write/command reached
538
+ wade's guards as an empty event — denying an agy plan session its own
539
+ ``PLAN.md`` and silently no-op'ing shell containment. The rest of the unit
540
+ suite feeds already-normalized events, so these are the only tests that
541
+ exercise the raw agy arg names; they guard against a dialect regression.
542
+ """
543
+
544
+ def _agy(self, guard: str, payload: dict[str, object]):
545
+ return _run_lean("pre_tool_use", guard, "antigravity-cli", json.dumps(payload))
546
+
547
+ def test_plan_write_targetfile_allowed(self) -> None:
548
+ # agy's write arg is ``TargetFile`` — a plan-artifact write must be allowed.
549
+ r = self._agy(
550
+ "plan",
551
+ {
552
+ "toolCall": {
553
+ "name": "write_to_file",
554
+ "args": {"TargetFile": f"{WT}/.wade/plans/PLAN.md", "CodeContent": "x"},
555
+ },
556
+ "stepIdx": 1,
557
+ },
558
+ )
559
+ assert r.returncode == 0
560
+ assert json.loads(r.stdout)["decision"] == "allow"
561
+
562
+ def test_shell_read_commandline_allowed(self) -> None:
563
+ # agy's shell arg is ``CommandLine`` — a read command must be allowed and
564
+ # emit an explicit {"decision": "allow"} (a bare {} is read as deny by agy).
565
+ r = self._agy(
566
+ "plan",
567
+ {
568
+ "toolCall": {
569
+ "name": "run_command",
570
+ "args": {"CommandLine": "wade knowledge get --search tools", "Cwd": WT},
571
+ },
572
+ "stepIdx": 2,
573
+ },
574
+ )
575
+ assert r.returncode == 0
576
+ assert json.loads(r.stdout)["decision"] == "allow"
577
+
578
+ def test_shell_escape_commandline_denied(self) -> None:
579
+ # shell_containment must read ``CommandLine`` and block a redirect that
580
+ # resolves outside the worktree (the A2 gap in crossby#147).
581
+ r = self._agy(
582
+ "plan",
583
+ {
584
+ "toolCall": {
585
+ "name": "run_command",
586
+ "args": {"CommandLine": "echo x > /tmp/../etc/escape", "Cwd": WT},
587
+ },
588
+ "stepIdx": 3,
589
+ },
590
+ )
591
+ assert r.returncode == 0
524
592
  assert json.loads(r.stdout)["decision"] == "deny"
593
+ assert "BLOCKED" in r.stderr
525
594
 
526
595
 
527
596
  class TestPerToolDialectsMatchCrossby:
@@ -882,4 +951,7 @@ class TestMemoryAllowlistCLI:
882
951
  # another out-of-worktree write for it — denied.
883
952
  stdin = json.dumps({"tool_name": "Write", "tool_input": {"path": str(self._mem_target())}})
884
953
  r = _run_lean("pre_tool_use", "worktree", "antigravity-cli", stdin)
885
- assert r.returncode == 2
954
+ # agy's DECISION dialect exits 0 for both allow and deny — the block lives
955
+ # in the {"decision": "deny"} body, so assert that rather than the exit code.
956
+ assert r.returncode == 0
957
+ assert json.loads(r.stdout)["decision"] == "deny"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes