wade-cli 0.54.0__tar.gz → 0.54.2__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 (412) hide show
  1. {wade_cli-0.54.0 → wade_cli-0.54.2}/.wade.yml +2 -2
  2. {wade_cli-0.54.0 → wade_cli-0.54.2}/CHANGELOG.md +12 -0
  3. {wade_cli-0.54.0 → wade_cli-0.54.2}/KNOWLEDGE.md +18 -0
  4. {wade_cli-0.54.0 → wade_cli-0.54.2}/KNOWLEDGE.ratings.jsonl +13 -0
  5. {wade_cli-0.54.0 → wade_cli-0.54.2}/PKG-INFO +2 -2
  6. {wade_cli-0.54.0 → wade_cli-0.54.2}/docs/dev/architecture.md +6 -4
  7. {wade_cli-0.54.0 → wade_cli-0.54.2}/pyproject.toml +2 -2
  8. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/__init__.py +1 -1
  9. wade_cli-0.54.2/tests/unit/test_cli/test_autocomplete.py +122 -0
  10. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_crossby_contract.py +1 -1
  11. {wade_cli-0.54.0 → wade_cli-0.54.2}/.gitattributes +0 -0
  12. {wade_cli-0.54.0 → wade_cli-0.54.2}/.github/workflows/auto-version.yml +0 -0
  13. {wade_cli-0.54.0 → wade_cli-0.54.2}/.github/workflows/ci.yml +0 -0
  14. {wade_cli-0.54.0 → wade_cli-0.54.2}/.github/workflows/pr-title-lint.yml +0 -0
  15. {wade_cli-0.54.0 → wade_cli-0.54.2}/.github/workflows/publish.yml +0 -0
  16. {wade_cli-0.54.0 → wade_cli-0.54.2}/.github/workflows/release.yml +0 -0
  17. {wade_cli-0.54.0 → wade_cli-0.54.2}/.gitignore +0 -0
  18. {wade_cli-0.54.0 → wade_cli-0.54.2}/.pre-commit-config.yaml +0 -0
  19. {wade_cli-0.54.0 → wade_cli-0.54.2}/AGENTS.md +0 -0
  20. {wade_cli-0.54.0 → wade_cli-0.54.2}/CONTRIBUTING.md +0 -0
  21. {wade_cli-0.54.0 → wade_cli-0.54.2}/README.md +0 -0
  22. {wade_cli-0.54.0 → wade_cli-0.54.2}/assets/wade.png +0 -0
  23. {wade_cli-0.54.0 → wade_cli-0.54.2}/docker-compose.e2e.yml +0 -0
  24. {wade_cli-0.54.0 → wade_cli-0.54.2}/docs/dev/documentation-policies.md +0 -0
  25. {wade_cli-0.54.0 → wade_cli-0.54.2}/docs/dev/extending.md +0 -0
  26. {wade_cli-0.54.0 → wade_cli-0.54.2}/docs/dev/skills-system.md +0 -0
  27. {wade_cli-0.54.0 → wade_cli-0.54.2}/docs/dev/testing.md +0 -0
  28. {wade_cli-0.54.0 → wade_cli-0.54.2}/docs/dev/workflows-and-skills.md +0 -0
  29. {wade_cli-0.54.0 → wade_cli-0.54.2}/install.sh +0 -0
  30. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/auto_version.py +0 -0
  31. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/changelog.py +0 -0
  32. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/check-all.sh +0 -0
  33. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/check.sh +0 -0
  34. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/fmt.sh +0 -0
  35. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/hooks/pre-push +0 -0
  36. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/install-hooks.sh +0 -0
  37. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/release.sh +0 -0
  38. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/setup-worktree.sh +0 -0
  39. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test-concurrency.sh +0 -0
  40. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test-e2e-docker.sh +0 -0
  41. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test-e2e.sh +0 -0
  42. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test-live-ai-taskr.sh +0 -0
  43. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test-live-ai.sh +0 -0
  44. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test-live-gh.sh +0 -0
  45. {wade_cli-0.54.0 → wade_cli-0.54.2}/scripts/test.sh +0 -0
  46. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/__main__.py +0 -0
  47. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/__init__.py +0 -0
  48. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/admin.py +0 -0
  49. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/autocomplete.py +0 -0
  50. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/deps_session.py +0 -0
  51. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/hook.py +0 -0
  52. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/implementation_session.py +0 -0
  53. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/knowledge.py +0 -0
  54. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/main.py +0 -0
  55. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/plan_session.py +0 -0
  56. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/review.py +0 -0
  57. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/review_pr_comments_session.py +0 -0
  58. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/session.py +0 -0
  59. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/session_shared.py +0 -0
  60. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/skills.py +0 -0
  61. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/task.py +0 -0
  62. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/cli/worktree.py +0 -0
  63. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/config/__init__.py +0 -0
  64. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/config/loader.py +0 -0
  65. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/config/migrations.py +0 -0
  66. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/config/schema.py +0 -0
  67. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/__init__.py +0 -0
  68. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/branch.py +0 -0
  69. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/hooks.py +0 -0
  70. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/pr.py +0 -0
  71. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/repo.py +0 -0
  72. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/stash.py +0 -0
  73. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/sync.py +0 -0
  74. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/git/worktree.py +0 -0
  75. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/hooks/__init__.py +0 -0
  76. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/hooks/cli.py +0 -0
  77. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/hooks/policies.py +0 -0
  78. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/logging/__init__.py +0 -0
  79. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/logging/context.py +0 -0
  80. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/logging/setup.py +0 -0
  81. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/__init__.py +0 -0
  82. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/batch.py +0 -0
  83. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/config.py +0 -0
  84. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/delegation.py +0 -0
  85. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/deps.py +0 -0
  86. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/events.py +0 -0
  87. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/hooks.py +0 -0
  88. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/permission.py +0 -0
  89. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/readiness.py +0 -0
  90. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/review.py +0 -0
  91. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/session.py +0 -0
  92. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/session_manifest.py +0 -0
  93. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/skill.py +0 -0
  94. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/task.py +0 -0
  95. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/workflow.py +0 -0
  96. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/models/worktree.py +0 -0
  97. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/__init__.py +0 -0
  98. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/_pr_delegate.py +0 -0
  99. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/base.py +0 -0
  100. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/clickup.py +0 -0
  101. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/github.py +0 -0
  102. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/markdown.py +0 -0
  103. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/providers/registry.py +0 -0
  104. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/__init__.py +0 -0
  105. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/ai_resolution.py +0 -0
  106. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/batch_review_service.py +0 -0
  107. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/bot_trigger.py +0 -0
  108. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/check_service.py +0 -0
  109. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/delegation_service.py +0 -0
  110. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/deps_service.py +0 -0
  111. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/documentation_receipt_service.py +0 -0
  112. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/__init__.py +0 -0
  113. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/_shared.py +0 -0
  114. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/batch.py +0 -0
  115. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/bootstrap.py +0 -0
  116. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/cleanup.py +0 -0
  117. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/core.py +0 -0
  118. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/done.py +0 -0
  119. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/draft_pr.py +0 -0
  120. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/lifecycle.py +0 -0
  121. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/sync.py +0 -0
  122. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/implementation_service/usage_tracking.py +0 -0
  123. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/__init__.py +0 -0
  124. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/auth.py +0 -0
  125. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/commands.py +0 -0
  126. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/config_io.py +0 -0
  127. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/manifest.py +0 -0
  128. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/migrations.py +0 -0
  129. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/prompts_ai.py +0 -0
  130. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/prompts_setup.py +0 -0
  131. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/init_service/shell.py +0 -0
  132. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/knowledge_recovery.py +0 -0
  133. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/knowledge_search.py +0 -0
  134. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/knowledge_service.py +0 -0
  135. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/plan_service.py +0 -0
  136. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/prompt_delivery.py +0 -0
  137. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/review_delegation_service.py +0 -0
  138. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/review_record_service.py +0 -0
  139. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/review_service.py +0 -0
  140. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/review_settle.py +0 -0
  141. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/session_composition_service.py +0 -0
  142. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/skill_diagnostics_service.py +0 -0
  143. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/skill_invocation_service.py +0 -0
  144. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/smart_start.py +0 -0
  145. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/services/task_service.py +0 -0
  146. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/__init__.py +0 -0
  147. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/catalog.py +0 -0
  148. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/discovery.py +0 -0
  149. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/doc_targets.py +0 -0
  150. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/installer.py +0 -0
  151. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/materializer.py +0 -0
  152. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/pointer.py +0 -0
  153. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/resolver.py +0 -0
  154. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/skills/validation.py +0 -0
  155. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/ui/__init__.py +0 -0
  156. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/ui/console.py +0 -0
  157. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/ui/prompts.py +0 -0
  158. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/__init__.py +0 -0
  159. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/body_markers.py +0 -0
  160. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/clipboard.py +0 -0
  161. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/conventional.py +0 -0
  162. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/filelock.py +0 -0
  163. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/gitref.py +0 -0
  164. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/http.py +0 -0
  165. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/install.py +0 -0
  166. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/knowledge_file.py +0 -0
  167. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/markdown.py +0 -0
  168. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/markers.py +0 -0
  169. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/paths.py +0 -0
  170. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/plan_validation.py +0 -0
  171. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/process.py +0 -0
  172. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/safe_state.py +0 -0
  173. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/slug.py +0 -0
  174. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/stale_base.py +0 -0
  175. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/templates.py +0 -0
  176. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/terminal.py +0 -0
  177. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/token_usage_markdown.py +0 -0
  178. {wade_cli-0.54.0 → wade_cli-0.54.2}/src/wade/utils/update_check.py +0 -0
  179. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/agents-pointer.md +0 -0
  180. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/hooks/commit-msg +0 -0
  181. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/hooks/pre-commit +0 -0
  182. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/hooks/pre-push +0 -0
  183. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/deps-analysis.md +0 -0
  184. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/implement-context.md +0 -0
  185. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/plan-session.md +0 -0
  186. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/review-batch.md +0 -0
  187. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/review-code.md +0 -0
  188. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/review-plan.md +0 -0
  189. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/review-pr-comments.md +0 -0
  190. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/session-start-implement.md +0 -0
  191. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/session-start-plan.md +0 -0
  192. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/prompts/session-start-review.md +0 -0
  193. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/setup-worktree.sh.example +0 -0
  194. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/batch-review/SKILL.md +0 -0
  195. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/code-review/SKILL.md +0 -0
  196. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/dependency-analysis/SKILL.md +0 -0
  197. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/implementation/SKILL.md +0 -0
  198. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/knowledge/SKILL.md +0 -0
  199. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/plan-review/SKILL.md +0 -0
  200. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/planning/SKILL.md +0 -0
  201. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/review-comments/SKILL.md +0 -0
  202. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/task/SKILL.md +0 -0
  203. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/task/examples.md +0 -0
  204. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/task/plan-format.md +0 -0
  205. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/skills/task/reference/session-summary-format.md +0 -0
  206. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/statusline-command.sh +0 -0
  207. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/_partials/completion.md +0 -0
  208. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/_partials/documentation-step.md +0 -0
  209. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/_partials/interaction-policy.md +0 -0
  210. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/_partials/knowledge-step.md +0 -0
  211. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/_partials/review-budget.md +0 -0
  212. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/implementation.md +0 -0
  213. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/plan.md +0 -0
  214. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/documentation.md +0 -0
  215. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/new-plan.md +0 -0
  216. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/plan-output-contract.md +0 -0
  217. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/pr-summary-format.md +0 -0
  218. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/recovery.md +0 -0
  219. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/session-summary-format.md +0 -0
  220. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/reference/tracking-issues.md +0 -0
  221. {wade_cli-0.54.0 → wade_cli-0.54.2}/templates/workflows/review-pr-comments.md +0 -0
  222. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/__init__.py +0 -0
  223. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/concurrency/__init__.py +0 -0
  224. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/concurrency/test_batch_multi_pr.py +0 -0
  225. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/concurrency/test_knowledge_merge.py +0 -0
  226. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/concurrency/test_lock_retry.py +0 -0
  227. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/concurrency/test_stash_race.py +0 -0
  228. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/conftest.py +0 -0
  229. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/__init__.py +0 -0
  230. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/_support.py +0 -0
  231. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/conftest.py +0 -0
  232. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/mock_gh_script.py +0 -0
  233. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_admin_contract.py +0 -0
  234. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_check_contract.py +0 -0
  235. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_implement_work_done_contract.py +0 -0
  236. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_knowledge_contract.py +0 -0
  237. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_mock_gh_contract.py +0 -0
  238. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_plan_contract.py +0 -0
  239. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_review_contract.py +0 -0
  240. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_smart_start_contract.py +0 -0
  241. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_task_contract.py +0 -0
  242. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/e2e/test_work_sync_list_contract.py +0 -0
  243. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
  244. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
  245. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/fixtures/transcripts/claude_session.txt +0 -0
  246. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/fixtures/transcripts/codex_session.txt +0 -0
  247. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/fixtures/transcripts/copilot_session.txt +0 -0
  248. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/fixtures/transcripts/generic_session.txt +0 -0
  249. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/__init__.py +0 -0
  250. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_autostash.py +0 -0
  251. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_check.py +0 -0
  252. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_dynamic_skill_sessions.py +0 -0
  253. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_git.py +0 -0
  254. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_implementation_lifecycle.py +0 -0
  255. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_init.py +0 -0
  256. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_knowledge.py +0 -0
  257. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_markdown_provider.py +0 -0
  258. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_skill_context_budget.py +0 -0
  259. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/integration/test_skill_install.py +0 -0
  260. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/live/__init__.py +0 -0
  261. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/live/test_wade_live_ai.py +0 -0
  262. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/live/test_wade_live_ai_taskr.py +0 -0
  263. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/live/test_wade_live_gh.py +0 -0
  264. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/test_cli_basics.py +0 -0
  265. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/__init__.py +0 -0
  266. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/conftest.py +0 -0
  267. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/__init__.py +0 -0
  268. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_done_doc_pass_advisory.py +0 -0
  269. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_done_review_hint.py +0 -0
  270. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
  271. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_review_cli.py +0 -0
  272. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_session_subapps.py +0 -0
  273. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_shell_init.py +0 -0
  274. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_skills_session_cli.py +0 -0
  275. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_task_cli.py +0 -0
  276. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
  277. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_cli/test_work_cli.py +0 -0
  278. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/__init__.py +0 -0
  279. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/test_bot_review_config.py +0 -0
  280. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/test_dynamic_skill_config.py +0 -0
  281. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/test_loader.py +0 -0
  282. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/test_merge_strategy_migration.py +0 -0
  283. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/test_migrations.py +0 -0
  284. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_config/test_migrations_atomic.py +0 -0
  285. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_console.py +0 -0
  286. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_effort.py +0 -0
  287. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/__init__.py +0 -0
  288. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_all_patches_present.py +0 -0
  289. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_branch_list.py +0 -0
  290. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_branch_slugify.py +0 -0
  291. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_detached_worktree.py +0 -0
  292. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_is_merged_into.py +0 -0
  293. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_main_checkout_root.py +0 -0
  294. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_merge_count.py +0 -0
  295. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_pr_base.py +0 -0
  296. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_pr_lookup.py +0 -0
  297. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_pr_retry.py +0 -0
  298. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_pr_title.py +0 -0
  299. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_repo.py +0 -0
  300. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_reset_branch.py +0 -0
  301. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_scaffold_commit.py +0 -0
  302. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_stash_drop.py +0 -0
  303. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
  304. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_tip_commit_is_empty.py +0 -0
  305. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_git/test_worktree_remove.py +0 -0
  306. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_hooks/__init__.py +0 -0
  307. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_hooks/test_hook_cli.py +0 -0
  308. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_hooks/test_policies.py +0 -0
  309. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_hooks/test_post_tool_use.py +0 -0
  310. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_hooks/test_session_start.py +0 -0
  311. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/__init__.py +0 -0
  312. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_batch.py +0 -0
  313. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_config_models.py +0 -0
  314. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_delegation.py +0 -0
  315. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_deps_models.py +0 -0
  316. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_deps_partition.py +0 -0
  317. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_review.py +0 -0
  318. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_review_expectation.py +0 -0
  319. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_task_models.py +0 -0
  320. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_models/test_workflow_models.py +0 -0
  321. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_permission_mode.py +0 -0
  322. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_providers/__init__.py +0 -0
  323. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_providers/test_clickup.py +0 -0
  324. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_providers/test_github.py +0 -0
  325. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_providers/test_github_pr.py +0 -0
  326. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_providers/test_markdown.py +0 -0
  327. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/__init__.py +0 -0
  328. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_ai_resolution.py +0 -0
  329. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_batch_build_cmd.py +0 -0
  330. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_batch_pr_index.py +0 -0
  331. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_batch_review_service.py +0 -0
  332. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bootstrap_allowlist.py +0 -0
  333. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bootstrap_guard_matcher.py +0 -0
  334. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
  335. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bootstrap_post_tool_use.py +0 -0
  336. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bootstrap_pre_push.py +0 -0
  337. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bootstrap_session_start.py +0 -0
  338. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_bot_trigger.py +0 -0
  339. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_catchup.py +0 -0
  340. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_catchup_reconcile.py +0 -0
  341. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_check.py +0 -0
  342. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_cleanup_loss_guard.py +0 -0
  343. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_codex_worktree_launch_context.py +0 -0
  344. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_delegation_service.py +0 -0
  345. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_deps_service.py +0 -0
  346. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_documentation_receipt.py +0 -0
  347. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_done_gates.py +0 -0
  348. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_done_idempotent.py +0 -0
  349. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_done_plan_flag.py +0 -0
  350. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_done_pr_title_sync.py +0 -0
  351. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_draft_pr_base_fetch.py +0 -0
  352. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_draft_pr_retarget.py +0 -0
  353. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_implementation_done_sync.py +0 -0
  354. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_implementation_launch_context.py +0 -0
  355. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_implementation_service.py +0 -0
  356. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
  357. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_init.py +0 -0
  358. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_init_shell_integration.py +0 -0
  359. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_knowledge_recovery.py +0 -0
  360. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_knowledge_search.py +0 -0
  361. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_knowledge_service.py +0 -0
  362. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_managed_git_hooks.py +0 -0
  363. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_no_direct_git.py +0 -0
  364. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_plan_service.py +0 -0
  365. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
  366. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_post_implementation_lifecycle.py +0 -0
  367. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_pr_lookup_guards.py +0 -0
  368. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_pr_summary_path.py +0 -0
  369. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_pre_push_backstop.py +0 -0
  370. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_preserve_session_data.py +0 -0
  371. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_prompt_delivery.py +0 -0
  372. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_push_recovery.py +0 -0
  373. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_resolve_task_branch.py +0 -0
  374. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_resume_autonomy.py +0 -0
  375. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_review_delegation_service.py +0 -0
  376. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_review_receipts.py +0 -0
  377. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_review_records.py +0 -0
  378. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_review_service.py +0 -0
  379. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_review_status_block.py +0 -0
  380. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_skill_diagnostics_service.py +0 -0
  381. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_smart_start.py +0 -0
  382. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_smart_start_resume.py +0 -0
  383. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_stale_base_surface.py +0 -0
  384. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_sync_base_branch.py +0 -0
  385. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_task_service.py +0 -0
  386. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
  387. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
  388. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_doc_targets.py +0 -0
  389. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_dynamic_skills.py +0 -0
  390. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_generic_builtin_boundaries.py +0 -0
  391. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_knowledge_attributes.py +0 -0
  392. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
  393. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_pointer.py +0 -0
  394. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_skills/test_review_budget_partial.py +0 -0
  395. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/__init__.py +0 -0
  396. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_body_markers.py +0 -0
  397. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_conventional.py +0 -0
  398. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_filelock.py +0 -0
  399. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_gitref.py +0 -0
  400. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_http.py +0 -0
  401. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_install.py +0 -0
  402. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_markdown.py +0 -0
  403. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_markers.py +0 -0
  404. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_plan_validation.py +0 -0
  405. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_process.py +0 -0
  406. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_prompts.py +0 -0
  407. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_slug.py +0 -0
  408. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_stale_base.py +0 -0
  409. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_terminal.py +0 -0
  410. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_terminal_launch.py +0 -0
  411. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_utils/test_update_check.py +0 -0
  412. {wade_cli-0.54.0 → wade_cli-0.54.2}/tests/unit/test_yolo.py +0 -0
@@ -7,7 +7,7 @@ project:
7
7
  merge_strategy: PR
8
8
  ai:
9
9
  default_tool: claude
10
- default_model: claude-opus-4.8
10
+ default_model: claude-opus-5
11
11
  effort: xhigh
12
12
  plan:
13
13
  effort: xhigh
@@ -54,7 +54,7 @@ models:
54
54
  model: claude-sonnet-5
55
55
  effort: xhigh
56
56
  very_complex:
57
- model: claude-opus-4.8
57
+ model: claude-opus-5
58
58
  effort: xhigh
59
59
  provider:
60
60
  name: github
@@ -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.54.2] — 2026-09-02
8
+
9
+ ### Chores
10
+
11
+ - adopt Crossby 0.28 and Opus defaults (#483) (99e32c1)
12
+
13
+ ## [v0.54.1] — 2026-09-02
14
+
15
+ ### Chores
16
+
17
+ - adopt Crossby 0.27.0 model catalogs and defaults (#477) (3b3a223)
18
+
7
19
  ## [v0.54.0] — 2026-08-31
8
20
 
9
21
  ### Features
@@ -689,3 +689,21 @@ annotate_bot_expectations' marker_root is inconsistent across call sites in revi
689
689
  The three session skills are hard-capped by tests/integration/test_skill_context_budget.py (BUDGET_CHARS covers launch prompt + rendered SKILL.md with partials expanded); the review-pr-comments skill had only ~170 chars of headroom in v0.50.7, so any new skill rule must be paid for by trimming an existing one. Measure with the rendered size, not the raw template — _partials/ expansion (user-interaction, review-budget, doc-update-step) roughly doubles it.
690
690
 
691
691
  ---
692
+
693
+ ## cb42b47b0a78 | 2026-09-02 | implementation | tags: crossby, dependencies, testing | Issue #476
694
+
695
+ Bumping the crossby pin in pyproject.toml also requires updating a hardcoded exact version in tests/unit/test_skills/test_crossby_contract.py (assert version("crossby") == "X.Y.Z") — pyproject is the range source of truth, but that test pins the exact resolved version alongside the semi-private skill-discovery API contract. Change both in the same commit or the suite fails.
696
+
697
+ ---
698
+
699
+ ## c55057c13ebb | 2026-09-02 | implementation | tags: dependencies, crossby, tooling | Issue #476
700
+
701
+ uv.lock is gitignored in this repo, so a crossby pin bump needs BOTH `uv lock` and `uv pip install -e ".[dev]"` — `uv lock` only rewrites the lockfile and leaves the venv on the old version, so version("crossby") and the whole test suite still run against the previous release. Never commit uv.lock.
702
+
703
+ ---
704
+
705
+ ## caa4604d0d03 | 2026-09-02 | implementation | tags: crossby, documentation, dependencies, model-registry | Issue #476
706
+
707
+ docs/dev/architecture.md's .wade.yml example hardcodes crossby's claude complexity-tier model IDs, so every crossby pin bump silently makes it stale — wade init writes whatever crossby.config.defaults.get_defaults() returns, not those literals. Update that block on every pin bump; note the crossby version RANGE is deliberately not restated in that file (architecture.md line ~171) so only the tier values need touching. Blast radius on existing projects is narrow: wade update re-resolves defaults but calls _patch_config without force, backfilling only tiers a config left unset.
708
+
709
+ ---
@@ -139,3 +139,16 @@
139
139
  {"dir": "up", "id": "9d1174462f4f", "ts": "2026-08-23T12:02:54.794039+00:00"}
140
140
  {"dir": "up", "id": "cc91cd11", "ts": "2026-08-23T12:51:53.485846+00:00"}
141
141
  {"dir": "up", "id": "cc91cd11", "ts": "2026-08-23T14:26:37.437348+00:00"}
142
+ {"dir": "up", "event_id": "5af81b1c07f24fe18f9277c5c8194925", "id": "ae5df2be", "ts": "2026-09-02T11:12:02.664986+00:00"}
143
+ {"dir": "up", "event_id": "7fc6df916fd740cfbddf707fdc221377", "id": "a15045c3", "ts": "2026-09-02T11:12:02.858245+00:00"}
144
+ {"dir": "up", "event_id": "57c65a7982544d3ca8570b05355aae6c", "id": "8ee8260b", "ts": "2026-09-02T11:12:03.056495+00:00"}
145
+ {"dir": "up", "event_id": "778f96fb855347ef8ebe126cec1b3e9e", "id": "a44493f7", "ts": "2026-09-02T15:22:01.791564+00:00"}
146
+ {"dir": "up", "event_id": "f801f16d34c947a3a2c6bc6b2ccf93c5", "id": "97d81e85", "ts": "2026-09-02T15:22:02.033543+00:00"}
147
+ {"dir": "up", "event_id": "86b51e9e597345458b1a9766a0788bfb", "id": "ae5df2be", "ts": "2026-09-02T15:22:02.278038+00:00"}
148
+ {"dir": "up", "event_id": "4db30022d5784427a9e5ec78a0ce8511", "id": "9f5e5e2c", "ts": "2026-09-02T15:22:02.524170+00:00"}
149
+ {"dir": "up", "event_id": "783336b5e7a04cd8879dd56d73f2fb1b", "id": "1c18f1d4", "ts": "2026-09-02T15:22:02.772169+00:00"}
150
+ {"dir": "up", "event_id": "341809dc1867428094f1857f627b4d30", "id": "235fb8e8", "ts": "2026-09-02T15:22:03.030022+00:00"}
151
+ {"dir": "up", "event_id": "cda2226d804e4fc698e8e0760b444048", "id": "8ee8260b", "ts": "2026-09-02T15:22:03.280856+00:00"}
152
+ {"dir": "up", "event_id": "0d0c898f52b54710a8d50b82cf78444a", "id": "a15045c3", "ts": "2026-09-02T15:22:03.529067+00:00"}
153
+ {"dir": "up", "event_id": "417925753e00400a98e04c6a7d41ccc4", "id": "ae5df2be", "ts": "2026-09-02T15:39:33.320072+00:00"}
154
+ {"dir": "up", "event_id": "a23ed60deb074def962f804a7ff9541a", "id": "fb2a067bb103", "ts": "2026-09-02T15:39:33.521027+00:00"}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: wade-cli
3
- Version: 0.54.0
3
+ Version: 0.54.2
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.4
19
+ Requires-Dist: crossby<0.29.0,>=0.28.0
20
20
  Requires-Dist: httpx<1.0,>=0.27
21
21
  Requires-Dist: pydantic-settings>=2.0
22
22
  Requires-Dist: pydantic>=2.0
@@ -767,12 +767,12 @@ ai:
767
767
  tool: claude
768
768
  implement:
769
769
  tool: claude
770
- models:
770
+ models: # values below are crossby's claude defaults, not wade constants
771
771
  claude:
772
772
  easy: claude-haiku-4.5
773
- medium: claude-haiku-4.5
774
- complex: claude-sonnet-4.6
775
- very_complex: claude-opus-4.6
773
+ medium: claude-sonnet-5
774
+ complex: claude-sonnet-5
775
+ very_complex: claude-opus-5
776
776
  provider:
777
777
  name: github
778
778
  hooks:
@@ -957,6 +957,8 @@ exactly as before #448. See knowledge `cc91cd11` for the generalized principle.
957
957
 
958
958
  **Model complexity mapping**: The `models` section maps AI tool names to complexity-tiered model IDs (`easy`, `medium`, `complex`, `very_complex`). When `wade implement` is invoked, the service reads the `complexity:X` label from the issue (falling back to `## Complexity` in the body), maps it to the appropriate configured model, and passes it as `--model` to the AI tool — unless the user explicitly passed `--model` themselves.
959
959
 
960
+ The tier values `wade init` writes are **not wade constants** — `init_service/config_io.py::_resolve_models()` seeds them from `crossby.config.defaults.get_defaults(tool)`, so **bumping the crossby pin changes what newly initialized projects get**. The example above shows crossby's `claude` defaults at the currently pinned version; run `get_defaults()` for the authoritative set rather than trusting a doc snapshot, and re-check this block on every crossby bump. A bump does **not** rewrite tiers an existing `.wade.yml` already sets: `wade update` re-resolves the defaults and calls `_patch_config` without `force`, which backfills only *absent* tiers. So a fresh `wade init` picks up the new defaults wholesale, while an existing project changes only where it left a tier unset.
961
+
960
962
  **Per-command AI tool and model overrides**: The `ai` section supports `plan`, `deps`, `implement`, `review_plan`, `review_implementation`, `review_batch`, and `review_pr_comments` sub-sections (`AI_COMMAND_NAMES` in `models/config.py`), with optional `tool`, `model`, `mode`, `effort`, `enabled`, `yolo`, `permission_mode`, `network_access`, and `timeout` keys as applicable. `network_access` (global `ai.network_access` or per-command) is the Codex sandbox network pin resolved by `resolve_network_access()`: it defaults to **True** for `implement` and `review_pr_comments`, whose lifecycle requires GitHub, and **False** for every other command. The CLI, per-command, and global policy levels remain higher-precedence opt-outs — see the "Codex sandboxed-worktree git writes & network policy" section above. `timeout` bounds a headless subprocess (seconds). When **unset**, the review/deps services compute the budget with `effective_timeout` (`delegation_service.py`, #366): it scales from **payload bytes + reasoning effort** — `scaled_timeout` starts at a **600s floor** (`TIMEOUT_FLOOR`, covers CLI cold-start + a small high-effort run), adds ~0.0075 s/byte of prompt, multiplies high/xhigh/max effort by 1.5–1.75×, and clamps to a **1500s ceiling** (`TIMEOUT_CEILING`). A headless timeout is **not** discarded: `run` (`utils/process.py`) decodes and reattaches the partial stdout (bytes even under `text=True`), `_delegate_headless` returns it as `feedback` with `DelegationResult.timed_out=True`, and wade **retries once** at a longer budget (`extended_timeout`, 1.5×) — bounding the *sum* of both legs to `TOTAL_TIMEOUT_CAP` (`TIMEOUT_CEILING + TIMEOUT_CEILING * TIMEOUT_RETRY_MULTIPLIER`, ~3750s / 62.5 min) so the worst case is predictable while the retry always gets the full multiplier, never a shorter budget than the attempt that just timed out (#366 review). The pre-launch advisory — now also printed by `deps_service.analyze_deps` before a headless run, not just the review commands (#366 review) — announces that worst-case total. A crash (`CommandError` / non-zero exit) is never retried and never flagged `timed_out`. Setting `ai.<cmd>.timeout` **explicitly** is a deliberate override: it is honored verbatim and **bypasses scaling and the retry math** — the escape hatch for orchestrators with a hard tool-timeout (set it below the harness limit). The fallback chain (tool/model) is: CLI `--ai`/`--model` flag -> command-specific config -> global `default_tool`. This is implemented in `ProjectConfig.get_ai_tool(command)` and `ProjectConfig.get_model(command)`. When `mode` is omitted, `review_plan` and `review_implementation` default to `prompt`, while `review_batch` defaults to `interactive`. `review_pr_comments` (#389) governs the **auto-launched review session** (post-`done` "Wait for reviews" → comments land → `review_service.start`): it resolves that session's tool, model, effort, and autonomy tier under its own key rather than inheriting `ai.implement.*`. The inherited implementation-session `tool` / `model` / `permission_mode` are honored only when the user set them *explicitly* (`--ai` / `--model` / `--permission-mode` / `--yolo`); the implementation flow forwards its already-*resolved* concrete values (never `None`), which would otherwise short-circuit the resolvers and shadow `ai.review_pr_comments` — so a merely config/default-derived value is dropped and the review config (then global `ai.*`) governs.
961
963
 
962
964
  **Permission (autonomy) mode vs. delegation `mode` — two orthogonal axes**: The `mode` key (`DelegationMode`: `prompt`/`interactive`/`headless`, `models/delegation.py`) governs *how* a tool is dispatched. `permission_mode` (`PermissionMode`: `default`/`accept-edits`/`auto`/`yolo`, `models/permission.py`) governs *how much* the tool may do without prompting — the autonomy axis crossby exposes via the `yolo`/`auto`/`accept_edits` launch booleans. Do **not** conflate them: they live in separate modules on purpose. Resolution (`resolve_permission_mode()` in `ai_resolution.py`) follows CLI `--permission-mode` > `--yolo` alias > command config > global config > `default`; `permission_mode` wins over the legacy `yolo` alias at any level, and `get_yolo()`/`resolve_yolo()` are thin shims that derive from the resolved mode so the alias has a single source of truth. WADE forwards only the *requested* tier and does **not** gate on per-tool capability — crossby owns capability-aware downgrades and warnings (`_autonomy_launch_args`), so `auto` on a non-Claude tool downgrades to `accept-edits` instead of WADE silently disabling it. The headless delegation path always forces `default` (no autonomy grant) regardless of config, since `deps`/`review_plan`/`review_implementation`/`review_batch` are read/analytical; `review_pr_comments` is the exception — it launches an *interactive* session and honors its configured `ai.review_pr_comments.permission_mode`. `plan` is intentionally excluded from `PermissionMode` (WADE drives plan mode separately via `plan_service` → `plan_mode=True` for native plan tools, and `plan_mode=False` for Antigravity CLI whose native plan mode sandboxes writes to an external brain store while WADE's plan-artifact guard enforces containment); a configured or CLI-supplied `permission_mode: plan` (or any invalid value) warns and falls back to `default`. Every launch command (`plan`, `implement`, `implement-batch`, `review pr-comments`, `review plan`/`implementation`/`batch`, `task deps`, and the delegation paths) exposes `--yolo`/`--permission-mode` and resolves + forwards the tier; `confirm_ai_selection()` (`ai_resolution.py`) **always displays** the resolved tool/model/effort/permission mode with a per-tier descriptor (`permission.describe_permission_mode`) before its skip guard, so the mode surfaces on every path (TTY, non-TTY, headless, all-flags-explicit) and what is shown always equals what is applied. For the read-only headless paths (`deps`/`review_*` in headless mode), the service computes the *effective* mode as `default` and uses that single value for both display and the `DelegationRequest`, mirroring the `delegation_service` headless force-default rule. In addition, a completed non-zero headless exit preserves trimmed stdout and appends a clearly labeled stderr tail (the final 20 non-empty lines, capped at 4,000 characters, with truncation labeled); only failures with neither stream retain the generic no-output fallback.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "wade-cli"
7
- version = "0.54.0"
7
+ version = "0.54.2"
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.4,<0.25.0",
27
+ "crossby>=0.28.0,<0.29.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.54.0"
3
+ __version__ = "0.54.2"
@@ -0,0 +1,122 @@
1
+ """Model autocompletion reads Crossby's catalog at runtime, never a wade copy.
2
+
3
+ Every expectation here is derived from ``crossby.data.MODELS`` rather than
4
+ hardcoded, so a Crossby version bump that changes the catalog cannot make these
5
+ tests stale — it can only make them fail if ``complete_models`` stops tracking
6
+ the catalog. Re-run on every Crossby dependency change.
7
+
8
+ Two assertions are deliberate *vacuity guards* rather than assertions about
9
+ ``complete_models``: they check that the live catalog still has the shape a test
10
+ needs to prove anything (Claude and Codex catalogs differing; some cross-tool
11
+ overlap existing). A catalog reshaped enough to break one of those premises will
12
+ fail the guard, and its message names that cause so the failure is not misread
13
+ as a wade regression. They are kept because without them the test they guard
14
+ passes vacuously, which is the worse failure mode.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ import click
20
+ import pytest
21
+ import typer
22
+ from crossby.data import MODELS
23
+ from crossby.models.ai import AIToolID
24
+
25
+ from wade.cli.autocomplete import complete_models
26
+
27
+ _CLAUDE = AIToolID.CLAUDE.value
28
+ _CODEX = AIToolID.CODEX.value
29
+
30
+
31
+ def test_crossby_0_28_exposes_gemini_3_8_for_supported_tools() -> None:
32
+ assert "gemini-3.8-flash" in MODELS[AIToolID.ANTIGRAVITY_CLI.value]
33
+ assert {
34
+ "gemini-3.8-flash-low",
35
+ "gemini-3.8-flash-medium",
36
+ "gemini-3.8-flash-high",
37
+ }.issubset(MODELS[AIToolID.CURSOR.value])
38
+ assert "google/gemini-3.8-flash" in MODELS[AIToolID.OPENCODE.value]
39
+
40
+
41
+ def _ctx(ai: str | list[str] | None = None) -> typer.Context:
42
+ """A Typer context carrying the ``--ai`` param exactly as Click would."""
43
+ ctx = typer.Context(click.Command("wade"))
44
+ if ai is not None:
45
+ ctx.params["ai"] = ai
46
+ return ctx
47
+
48
+
49
+ def _catalog(*tools: str) -> list[str]:
50
+ """Sorted, deduplicated Crossby models for ``tools`` (all tools when empty)."""
51
+ keys = tools or tuple(MODELS)
52
+ return sorted({model for key in keys for model in MODELS.get(key, [])})
53
+
54
+
55
+ @pytest.fixture(scope="module")
56
+ def claude_prefix() -> str:
57
+ """A prefix taken from the live catalog that filters Claude's models strictly."""
58
+ models = _catalog(_CLAUDE)
59
+ prefix = models[0][:8]
60
+ assert [m for m in models if m.startswith(prefix)] != models, (
61
+ f"prefix {prefix!r} matches every Claude model — it cannot prove filtering"
62
+ )
63
+ return prefix
64
+
65
+
66
+ class TestCompleteModelsWithExplicitTool:
67
+ """With ``--ai`` present, completion stays scoped to the selected tool(s)."""
68
+
69
+ def test_returns_the_full_catalog_for_that_tool(self) -> None:
70
+ expected = _catalog(_CLAUDE)
71
+ assert expected, "crossby exposes no Claude models"
72
+ assert complete_models(_ctx(_CLAUDE), "") == expected
73
+
74
+ def test_excludes_models_belonging_only_to_another_tool(self) -> None:
75
+ codex_only = set(MODELS.get(_CODEX, [])) - set(MODELS.get(_CLAUDE, []))
76
+ assert codex_only, "crossby's codex and claude catalogs no longer differ"
77
+ assert codex_only.isdisjoint(complete_models(_ctx(_CLAUDE), ""))
78
+
79
+ def test_filters_by_prefix(self, claude_prefix: str) -> None:
80
+ result = complete_models(_ctx(_CLAUDE), claude_prefix)
81
+ assert result, f"no Claude model starts with {claude_prefix!r}"
82
+ assert result == [m for m in _catalog(_CLAUDE) if m.startswith(claude_prefix)]
83
+ assert set(result) < set(_catalog(_CLAUDE))
84
+
85
+ def test_repeated_flag_unions_the_selected_catalogs(self) -> None:
86
+ assert complete_models(_ctx([_CLAUDE, _CODEX]), "") == _catalog(_CLAUDE, _CODEX)
87
+
88
+ def test_the_same_tool_twice_is_deduplicated(self) -> None:
89
+ """Dedup holds by construction, without relying on tools sharing models.
90
+
91
+ The union case above pairs Claude with Codex, whose catalogs are
92
+ disjoint today, so it never actually exercises deduplication on this
93
+ branch. Repeating one tool forces every candidate to collide.
94
+ """
95
+ assert complete_models(_ctx([_CLAUDE, _CLAUDE]), "") == _catalog(_CLAUDE)
96
+
97
+ def test_unknown_tool_yields_no_candidates(self) -> None:
98
+ assert complete_models(_ctx("not-a-tool"), "") == []
99
+
100
+
101
+ class TestCompleteModelsWithoutTool:
102
+ """With no ``--ai``, completion spans the whole deduplicated catalog."""
103
+
104
+ def test_returns_every_catalog_entry_deduplicated(self) -> None:
105
+ expected = _catalog()
106
+ result = complete_models(_ctx(), "")
107
+ assert result == expected
108
+ assert len(result) == len(set(result))
109
+ assert len(result) < sum(len(models) for models in MODELS.values()), (
110
+ "no tool catalogs overlap, so deduplication is untested"
111
+ )
112
+
113
+ def test_is_a_superset_of_the_tool_scoped_result(self) -> None:
114
+ assert set(complete_models(_ctx(_CLAUDE), "")) < set(complete_models(_ctx(), ""))
115
+
116
+ def test_filters_by_prefix(self, claude_prefix: str) -> None:
117
+ result = complete_models(_ctx(), claude_prefix)
118
+ assert result == [m for m in _catalog() if m.startswith(claude_prefix)]
119
+ assert all(m.startswith(claude_prefix) for m in result)
120
+
121
+ def test_unmatched_prefix_yields_no_candidates(self) -> None:
122
+ assert complete_models(_ctx(), "zzz-no-such-model") == []
@@ -27,7 +27,7 @@ def _skill(root: Path, relative: str, name: str) -> Path:
27
27
 
28
28
 
29
29
  def test_crossby_version_and_skill_root_mapping_contract() -> None:
30
- assert version("crossby") == "0.24.4"
30
+ assert version("crossby") == "0.28.0"
31
31
  assert SKILLS_DIR == {
32
32
  AIToolID.CLAUDE: ".claude/skills",
33
33
  AIToolID.CURSOR: ".cursor/skills",
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