wade-cli 0.0.1__tar.gz → 0.29.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. wade_cli-0.29.0/.github/workflows/auto-version.yml +73 -0
  2. wade_cli-0.29.0/.github/workflows/ci.yml +71 -0
  3. wade_cli-0.29.0/.github/workflows/pr-title-lint.yml +31 -0
  4. wade_cli-0.29.0/.gitignore +48 -0
  5. wade_cli-0.29.0/.pre-commit-config.yaml +26 -0
  6. wade_cli-0.29.0/.wade.yml +66 -0
  7. wade_cli-0.29.0/AGENTS.md +144 -0
  8. wade_cli-0.29.0/CHANGELOG.md +712 -0
  9. wade_cli-0.29.0/CONTRIBUTING.md +92 -0
  10. wade_cli-0.29.0/KNOWLEDGE.md +115 -0
  11. wade_cli-0.29.0/KNOWLEDGE.ratings.yml +27 -0
  12. wade_cli-0.29.0/PKG-INFO +313 -0
  13. wade_cli-0.29.0/README.md +276 -0
  14. wade_cli-0.29.0/assets/wade.png +0 -0
  15. wade_cli-0.29.0/docker-compose.e2e.yml +25 -0
  16. wade_cli-0.29.0/docs/dev/architecture.md +339 -0
  17. wade_cli-0.29.0/docs/dev/documentation-policies.md +64 -0
  18. wade_cli-0.29.0/docs/dev/extending.md +64 -0
  19. wade_cli-0.29.0/docs/dev/skills-system.md +136 -0
  20. wade_cli-0.29.0/docs/dev/testing.md +246 -0
  21. wade_cli-0.29.0/install.sh +50 -0
  22. wade_cli-0.29.0/pyproject.toml +114 -0
  23. wade_cli-0.29.0/scripts/auto_version.py +159 -0
  24. wade_cli-0.29.0/scripts/changelog.py +195 -0
  25. wade_cli-0.29.0/scripts/check-all.sh +6 -0
  26. wade_cli-0.29.0/scripts/check.sh +33 -0
  27. wade_cli-0.29.0/scripts/fmt.sh +4 -0
  28. wade_cli-0.29.0/scripts/hooks/pre-push +103 -0
  29. wade_cli-0.29.0/scripts/install-hooks.sh +54 -0
  30. wade_cli-0.29.0/scripts/probe_models.sh +3 -0
  31. wade_cli-0.29.0/scripts/release.sh +92 -0
  32. wade_cli-0.29.0/scripts/setup-worktree.sh +29 -0
  33. wade_cli-0.29.0/scripts/test-e2e-docker.sh +29 -0
  34. wade_cli-0.29.0/scripts/test-e2e.sh +4 -0
  35. wade_cli-0.29.0/scripts/test-live-ai-taskr.sh +156 -0
  36. wade_cli-0.29.0/scripts/test-live-ai.sh +38 -0
  37. wade_cli-0.29.0/scripts/test-live-gh.sh +42 -0
  38. wade_cli-0.29.0/scripts/test.sh +12 -0
  39. wade_cli-0.29.0/src/wade/__init__.py +3 -0
  40. wade_cli-0.29.0/src/wade/__main__.py +5 -0
  41. wade_cli-0.29.0/src/wade/cli/__init__.py +1 -0
  42. wade_cli-0.29.0/src/wade/cli/admin.py +126 -0
  43. wade_cli-0.29.0/src/wade/cli/autocomplete.py +51 -0
  44. wade_cli-0.29.0/src/wade/cli/implementation_session.py +148 -0
  45. wade_cli-0.29.0/src/wade/cli/knowledge.py +359 -0
  46. wade_cli-0.29.0/src/wade/cli/main.py +607 -0
  47. wade_cli-0.29.0/src/wade/cli/plan_session.py +55 -0
  48. wade_cli-0.29.0/src/wade/cli/review.py +196 -0
  49. wade_cli-0.29.0/src/wade/cli/review_pr_comments_session.py +120 -0
  50. wade_cli-0.29.0/src/wade/cli/session_shared.py +61 -0
  51. wade_cli-0.29.0/src/wade/cli/task.py +316 -0
  52. wade_cli-0.29.0/src/wade/cli/worktree.py +130 -0
  53. wade_cli-0.29.0/src/wade/config/__init__.py +5 -0
  54. wade_cli-0.29.0/src/wade/config/loader.py +236 -0
  55. wade_cli-0.29.0/src/wade/config/migrations.py +91 -0
  56. wade_cli-0.29.0/src/wade/config/schema.py +31 -0
  57. wade_cli-0.29.0/src/wade/db/__init__.py +34 -0
  58. wade_cli-0.29.0/src/wade/db/engine.py +85 -0
  59. wade_cli-0.29.0/src/wade/db/repositories.py +266 -0
  60. wade_cli-0.29.0/src/wade/db/tables.py +131 -0
  61. wade_cli-0.29.0/src/wade/git/__init__.py +77 -0
  62. wade_cli-0.29.0/src/wade/git/branch.py +140 -0
  63. wade_cli-0.29.0/src/wade/git/pr.py +427 -0
  64. wade_cli-0.29.0/src/wade/git/repo.py +525 -0
  65. wade_cli-0.29.0/src/wade/git/stash.py +158 -0
  66. wade_cli-0.29.0/src/wade/git/sync.py +130 -0
  67. wade_cli-0.29.0/src/wade/git/worktree.py +195 -0
  68. wade_cli-0.29.0/src/wade/hooks/__init__.py +19 -0
  69. wade_cli-0.29.0/src/wade/hooks/plan_write_guard.py +200 -0
  70. wade_cli-0.29.0/src/wade/hooks/worktree_guard.py +186 -0
  71. wade_cli-0.29.0/src/wade/logging/__init__.py +1 -0
  72. wade_cli-0.29.0/src/wade/logging/context.py +18 -0
  73. wade_cli-0.29.0/src/wade/logging/setup.py +41 -0
  74. wade_cli-0.29.0/src/wade/models/__init__.py +69 -0
  75. wade_cli-0.29.0/src/wade/models/batch.py +33 -0
  76. wade_cli-0.29.0/src/wade/models/config.py +227 -0
  77. wade_cli-0.29.0/src/wade/models/delegation.py +42 -0
  78. wade_cli-0.29.0/src/wade/models/deps.py +152 -0
  79. wade_cli-0.29.0/src/wade/models/events.py +45 -0
  80. wade_cli-0.29.0/src/wade/models/review.py +517 -0
  81. wade_cli-0.29.0/src/wade/models/session.py +112 -0
  82. wade_cli-0.29.0/src/wade/models/task.py +275 -0
  83. wade_cli-0.29.0/src/wade/providers/__init__.py +39 -0
  84. wade_cli-0.29.0/src/wade/providers/_pr_delegate.py +69 -0
  85. wade_cli-0.29.0/src/wade/providers/base.py +170 -0
  86. wade_cli-0.29.0/src/wade/providers/clickup.py +326 -0
  87. wade_cli-0.29.0/src/wade/providers/github.py +983 -0
  88. wade_cli-0.29.0/src/wade/providers/markdown.py +703 -0
  89. wade_cli-0.29.0/src/wade/providers/registry.py +72 -0
  90. wade_cli-0.29.0/src/wade/services/__init__.py +1 -0
  91. wade_cli-0.29.0/src/wade/services/ai_resolution.py +350 -0
  92. wade_cli-0.29.0/src/wade/services/batch_review_service.py +548 -0
  93. wade_cli-0.29.0/src/wade/services/check_service.py +584 -0
  94. wade_cli-0.29.0/src/wade/services/delegation_service.py +271 -0
  95. wade_cli-0.29.0/src/wade/services/deps_service.py +567 -0
  96. wade_cli-0.29.0/src/wade/services/implementation_service/__init__.py +11 -0
  97. wade_cli-0.29.0/src/wade/services/implementation_service/batch.py +533 -0
  98. wade_cli-0.29.0/src/wade/services/implementation_service/bootstrap.py +539 -0
  99. wade_cli-0.29.0/src/wade/services/implementation_service/core.py +2856 -0
  100. wade_cli-0.29.0/src/wade/services/implementation_service/usage_tracking.py +336 -0
  101. wade_cli-0.29.0/src/wade/services/init_service.py +2748 -0
  102. wade_cli-0.29.0/src/wade/services/knowledge_search.py +232 -0
  103. wade_cli-0.29.0/src/wade/services/knowledge_service.py +799 -0
  104. wade_cli-0.29.0/src/wade/services/plan_service.py +952 -0
  105. wade_cli-0.29.0/src/wade/services/prompt_delivery.py +37 -0
  106. wade_cli-0.29.0/src/wade/services/review_delegation_service.py +261 -0
  107. wade_cli-0.29.0/src/wade/services/review_service.py +1152 -0
  108. wade_cli-0.29.0/src/wade/services/review_settle.py +81 -0
  109. wade_cli-0.29.0/src/wade/services/smart_start.py +426 -0
  110. wade_cli-0.29.0/src/wade/services/task_service.py +757 -0
  111. wade_cli-0.29.0/src/wade/skills/__init__.py +1 -0
  112. wade_cli-0.29.0/src/wade/skills/installer.py +461 -0
  113. wade_cli-0.29.0/src/wade/skills/pointer.py +195 -0
  114. wade_cli-0.29.0/src/wade/ui/__init__.py +5 -0
  115. wade_cli-0.29.0/src/wade/ui/console.py +370 -0
  116. wade_cli-0.29.0/src/wade/ui/prompts.py +206 -0
  117. wade_cli-0.29.0/src/wade/utils/__init__.py +1 -0
  118. wade_cli-0.29.0/src/wade/utils/clipboard.py +43 -0
  119. wade_cli-0.29.0/src/wade/utils/http.py +96 -0
  120. wade_cli-0.29.0/src/wade/utils/install.py +118 -0
  121. wade_cli-0.29.0/src/wade/utils/markdown.py +166 -0
  122. wade_cli-0.29.0/src/wade/utils/process.py +147 -0
  123. wade_cli-0.29.0/src/wade/utils/slug.py +35 -0
  124. wade_cli-0.29.0/src/wade/utils/terminal.py +555 -0
  125. wade_cli-0.29.0/src/wade/utils/token_usage_markdown.py +105 -0
  126. wade_cli-0.29.0/src/wade/utils/update_check.py +141 -0
  127. wade_cli-0.29.0/templates/agents-pointer.md +11 -0
  128. wade_cli-0.29.0/templates/prompts/deps-analysis.md +16 -0
  129. wade_cli-0.29.0/templates/prompts/implement-context.md +19 -0
  130. wade_cli-0.29.0/templates/prompts/plan-session.md +58 -0
  131. wade_cli-0.29.0/templates/prompts/review-batch.md +20 -0
  132. wade_cli-0.29.0/templates/prompts/review-code.md +14 -0
  133. wade_cli-0.29.0/templates/prompts/review-plan.md +14 -0
  134. wade_cli-0.29.0/templates/prompts/review-pr-comments.md +23 -0
  135. wade_cli-0.29.0/templates/setup-worktree.sh.example +41 -0
  136. wade_cli-0.29.0/templates/skills/_partials/review-enforcement-rule.md +8 -0
  137. wade_cli-0.29.0/templates/skills/_partials/review-implementation-closing-step.md +24 -0
  138. wade_cli-0.29.0/templates/skills/_partials/review-plan-step.md +17 -0
  139. wade_cli-0.29.0/templates/skills/_partials/user-interaction.md +5 -0
  140. wade_cli-0.29.0/templates/skills/deps/SKILL.md +92 -0
  141. wade_cli-0.29.0/templates/skills/implementation-session/SKILL.md +341 -0
  142. wade_cli-0.29.0/templates/skills/knowledge/SKILL.md +145 -0
  143. wade_cli-0.29.0/templates/skills/plan-session/SKILL.md +176 -0
  144. wade_cli-0.29.0/templates/skills/review-pr-comments-session/SKILL.md +247 -0
  145. wade_cli-0.29.0/templates/skills/task/SKILL.md +187 -0
  146. wade_cli-0.29.0/templates/skills/task/examples.md +132 -0
  147. wade_cli-0.29.0/templates/skills/task/plan-format.md +81 -0
  148. wade_cli-0.29.0/templates/statusline-command.sh +106 -0
  149. wade_cli-0.29.0/tests/__init__.py +1 -0
  150. wade_cli-0.29.0/tests/conftest.py +104 -0
  151. wade_cli-0.29.0/tests/e2e/__init__.py +1 -0
  152. wade_cli-0.29.0/tests/e2e/_support.py +277 -0
  153. wade_cli-0.29.0/tests/e2e/conftest.py +100 -0
  154. wade_cli-0.29.0/tests/e2e/mock_gh_script.py +650 -0
  155. wade_cli-0.29.0/tests/e2e/test_admin_contract.py +67 -0
  156. wade_cli-0.29.0/tests/e2e/test_check_contract.py +122 -0
  157. wade_cli-0.29.0/tests/e2e/test_implement_work_done_contract.py +360 -0
  158. wade_cli-0.29.0/tests/e2e/test_knowledge_contract.py +116 -0
  159. wade_cli-0.29.0/tests/e2e/test_mock_gh_contract.py +52 -0
  160. wade_cli-0.29.0/tests/e2e/test_plan_contract.py +199 -0
  161. wade_cli-0.29.0/tests/e2e/test_review_contract.py +909 -0
  162. wade_cli-0.29.0/tests/e2e/test_smart_start_contract.py +203 -0
  163. wade_cli-0.29.0/tests/e2e/test_task_contract.py +335 -0
  164. wade_cli-0.29.0/tests/e2e/test_work_sync_list_contract.py +221 -0
  165. wade_cli-0.29.0/tests/fixtures/live/taskr_header_hi_body.md +17 -0
  166. wade_cli-0.29.0/tests/fixtures/live/taskr_header_howdy_body.md +17 -0
  167. wade_cli-0.29.0/tests/fixtures/transcripts/claude_session.txt +57 -0
  168. wade_cli-0.29.0/tests/fixtures/transcripts/codex_session.txt +4 -0
  169. wade_cli-0.29.0/tests/fixtures/transcripts/copilot_session.txt +48 -0
  170. wade_cli-0.29.0/tests/fixtures/transcripts/gemini_session.txt +30 -0
  171. wade_cli-0.29.0/tests/fixtures/transcripts/generic_session.txt +10 -0
  172. wade_cli-0.29.0/tests/integration/__init__.py +1 -0
  173. wade_cli-0.29.0/tests/integration/test_autostash.py +261 -0
  174. wade_cli-0.29.0/tests/integration/test_check.py +80 -0
  175. wade_cli-0.29.0/tests/integration/test_git.py +464 -0
  176. wade_cli-0.29.0/tests/integration/test_implementation_lifecycle.py +269 -0
  177. wade_cli-0.29.0/tests/integration/test_init.py +73 -0
  178. wade_cli-0.29.0/tests/integration/test_knowledge.py +276 -0
  179. wade_cli-0.29.0/tests/integration/test_markdown_provider.py +199 -0
  180. wade_cli-0.29.0/tests/integration/test_skill_install.py +352 -0
  181. wade_cli-0.29.0/tests/live/__init__.py +1 -0
  182. wade_cli-0.29.0/tests/live/test_wade_live_ai.py +88 -0
  183. wade_cli-0.29.0/tests/live/test_wade_live_ai_taskr.py +502 -0
  184. wade_cli-0.29.0/tests/live/test_wade_live_gh.py +354 -0
  185. wade_cli-0.29.0/tests/test_cli_basics.py +291 -0
  186. wade_cli-0.29.0/tests/unit/__init__.py +1 -0
  187. wade_cli-0.29.0/tests/unit/conftest.py +20 -0
  188. wade_cli-0.29.0/tests/unit/test_cli/__init__.py +1 -0
  189. wade_cli-0.29.0/tests/unit/test_cli/test_done_review_hint.py +189 -0
  190. wade_cli-0.29.0/tests/unit/test_cli/test_knowledge_cli.py +487 -0
  191. wade_cli-0.29.0/tests/unit/test_cli/test_review_cli.py +524 -0
  192. wade_cli-0.29.0/tests/unit/test_cli/test_session_subapps.py +225 -0
  193. wade_cli-0.29.0/tests/unit/test_cli/test_shell_init.py +105 -0
  194. wade_cli-0.29.0/tests/unit/test_cli/test_task_cli.py +66 -0
  195. wade_cli-0.29.0/tests/unit/test_cli/test_work_ai_flags.py +39 -0
  196. wade_cli-0.29.0/tests/unit/test_cli/test_work_cli.py +113 -0
  197. wade_cli-0.29.0/tests/unit/test_config/__init__.py +1 -0
  198. wade_cli-0.29.0/tests/unit/test_config/test_loader.py +333 -0
  199. wade_cli-0.29.0/tests/unit/test_config/test_migrations.py +184 -0
  200. wade_cli-0.29.0/tests/unit/test_config/test_migrations_atomic.py +119 -0
  201. wade_cli-0.29.0/tests/unit/test_console.py +29 -0
  202. wade_cli-0.29.0/tests/unit/test_db/__init__.py +0 -0
  203. wade_cli-0.29.0/tests/unit/test_db/test_repository_transactions.py +114 -0
  204. wade_cli-0.29.0/tests/unit/test_effort.py +426 -0
  205. wade_cli-0.29.0/tests/unit/test_git/__init__.py +0 -0
  206. wade_cli-0.29.0/tests/unit/test_git/test_branch_slugify.py +76 -0
  207. wade_cli-0.29.0/tests/unit/test_git/test_detached_worktree.py +125 -0
  208. wade_cli-0.29.0/tests/unit/test_git/test_pr_base.py +84 -0
  209. wade_cli-0.29.0/tests/unit/test_git/test_repo.py +157 -0
  210. wade_cli-0.29.0/tests/unit/test_git/test_scaffold_commit.py +89 -0
  211. wade_cli-0.29.0/tests/unit/test_git/test_sync_conflicted_files.py +107 -0
  212. wade_cli-0.29.0/tests/unit/test_git/test_worktree_remove.py +63 -0
  213. wade_cli-0.29.0/tests/unit/test_hooks/__init__.py +0 -0
  214. wade_cli-0.29.0/tests/unit/test_hooks/test_plan_write_guard.py +276 -0
  215. wade_cli-0.29.0/tests/unit/test_hooks/test_worktree_guard.py +250 -0
  216. wade_cli-0.29.0/tests/unit/test_models/__init__.py +1 -0
  217. wade_cli-0.29.0/tests/unit/test_models/test_batch.py +85 -0
  218. wade_cli-0.29.0/tests/unit/test_models/test_config_models.py +107 -0
  219. wade_cli-0.29.0/tests/unit/test_models/test_db.py +200 -0
  220. wade_cli-0.29.0/tests/unit/test_models/test_delegation.py +90 -0
  221. wade_cli-0.29.0/tests/unit/test_models/test_deps_models.py +85 -0
  222. wade_cli-0.29.0/tests/unit/test_models/test_deps_partition.py +58 -0
  223. wade_cli-0.29.0/tests/unit/test_models/test_review.py +927 -0
  224. wade_cli-0.29.0/tests/unit/test_models/test_task_models.py +282 -0
  225. wade_cli-0.29.0/tests/unit/test_providers/__init__.py +0 -0
  226. wade_cli-0.29.0/tests/unit/test_providers/test_clickup.py +542 -0
  227. wade_cli-0.29.0/tests/unit/test_providers/test_github.py +662 -0
  228. wade_cli-0.29.0/tests/unit/test_providers/test_github_pr.py +94 -0
  229. wade_cli-0.29.0/tests/unit/test_providers/test_markdown.py +700 -0
  230. wade_cli-0.29.0/tests/unit/test_services/__init__.py +1 -0
  231. wade_cli-0.29.0/tests/unit/test_services/test_ai_resolution.py +478 -0
  232. wade_cli-0.29.0/tests/unit/test_services/test_batch_review_service.py +1011 -0
  233. wade_cli-0.29.0/tests/unit/test_services/test_bootstrap_allowlist.py +377 -0
  234. wade_cli-0.29.0/tests/unit/test_services/test_bootstrap_hook_timeout.py +130 -0
  235. wade_cli-0.29.0/tests/unit/test_services/test_catchup.py +274 -0
  236. wade_cli-0.29.0/tests/unit/test_services/test_check.py +387 -0
  237. wade_cli-0.29.0/tests/unit/test_services/test_delegation_service.py +312 -0
  238. wade_cli-0.29.0/tests/unit/test_services/test_deps_service.py +513 -0
  239. wade_cli-0.29.0/tests/unit/test_services/test_done_plan_flag.py +168 -0
  240. wade_cli-0.29.0/tests/unit/test_services/test_done_via_direct_cleanup.py +279 -0
  241. wade_cli-0.29.0/tests/unit/test_services/test_implementation_done_sync.py +1554 -0
  242. wade_cli-0.29.0/tests/unit/test_services/test_implementation_service.py +2167 -0
  243. wade_cli-0.29.0/tests/unit/test_services/test_implementation_service_resume.py +43 -0
  244. wade_cli-0.29.0/tests/unit/test_services/test_init.py +2541 -0
  245. wade_cli-0.29.0/tests/unit/test_services/test_init_shell_integration.py +244 -0
  246. wade_cli-0.29.0/tests/unit/test_services/test_knowledge_search.py +153 -0
  247. wade_cli-0.29.0/tests/unit/test_services/test_knowledge_service.py +1386 -0
  248. wade_cli-0.29.0/tests/unit/test_services/test_plan_service.py +903 -0
  249. wade_cli-0.29.0/tests/unit/test_services/test_poll_for_reviews.py +822 -0
  250. wade_cli-0.29.0/tests/unit/test_services/test_post_implementation_lifecycle.py +439 -0
  251. wade_cli-0.29.0/tests/unit/test_services/test_pr_summary_path.py +108 -0
  252. wade_cli-0.29.0/tests/unit/test_services/test_preserve_session_data.py +237 -0
  253. wade_cli-0.29.0/tests/unit/test_services/test_prompt_delivery.py +52 -0
  254. wade_cli-0.29.0/tests/unit/test_services/test_review_delegation_service.py +717 -0
  255. wade_cli-0.29.0/tests/unit/test_services/test_review_service.py +1990 -0
  256. wade_cli-0.29.0/tests/unit/test_services/test_smart_start.py +739 -0
  257. wade_cli-0.29.0/tests/unit/test_services/test_smart_start_resume.py +410 -0
  258. wade_cli-0.29.0/tests/unit/test_services/test_sync_base_branch.py +115 -0
  259. wade_cli-0.29.0/tests/unit/test_services/test_task_service.py +457 -0
  260. wade_cli-0.29.0/tests/unit/test_services/test_tracked_managed_files.py +348 -0
  261. wade_cli-0.29.0/tests/unit/test_services/test_worktree_gitignore.py +247 -0
  262. wade_cli-0.29.0/tests/unit/test_skills/test_managed_gitignore.py +74 -0
  263. wade_cli-0.29.0/tests/unit/test_utils/__init__.py +1 -0
  264. wade_cli-0.29.0/tests/unit/test_utils/test_http.py +164 -0
  265. wade_cli-0.29.0/tests/unit/test_utils/test_install.py +295 -0
  266. wade_cli-0.29.0/tests/unit/test_utils/test_markdown.py +206 -0
  267. wade_cli-0.29.0/tests/unit/test_utils/test_process.py +179 -0
  268. wade_cli-0.29.0/tests/unit/test_utils/test_prompts.py +48 -0
  269. wade_cli-0.29.0/tests/unit/test_utils/test_slug.py +42 -0
  270. wade_cli-0.29.0/tests/unit/test_utils/test_terminal.py +79 -0
  271. wade_cli-0.29.0/tests/unit/test_utils/test_terminal_launch.py +513 -0
  272. wade_cli-0.29.0/tests/unit/test_utils/test_update_check.py +268 -0
  273. wade_cli-0.29.0/tests/unit/test_yolo.py +642 -0
  274. wade_cli-0.0.1/PKG-INFO +0 -27
  275. wade_cli-0.0.1/README.md +0 -7
  276. wade_cli-0.0.1/pyproject.toml +0 -32
  277. wade_cli-0.0.1/src/wade_cli/__init__.py +0 -3
@@ -0,0 +1,73 @@
1
+ name: Auto Version Bump
2
+
3
+ on:
4
+ pull_request:
5
+ types: [closed]
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ version-bump:
13
+ # Only run when the PR was actually merged
14
+ if: github.event.pull_request.merged == true
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Detect bump type
18
+ id: detect
19
+ env:
20
+ COMMIT_MSG: ${{ github.event.pull_request.title }}
21
+ run: |
22
+ MSG="$COMMIT_MSG"
23
+ FIRST_LINE=$(echo "$MSG" | head -n 1)
24
+
25
+ if echo "$MSG" | grep -q 'BREAKING CHANGE'; then
26
+ echo "bump=major" >> "$GITHUB_OUTPUT"
27
+ elif echo "$FIRST_LINE" | grep -qE '^[a-z]+(\(.+\))?!:'; then
28
+ echo "bump=major" >> "$GITHUB_OUTPUT"
29
+ elif echo "$FIRST_LINE" | grep -qE '^(feat|update)(\(.+\))?:'; then
30
+ echo "bump=minor" >> "$GITHUB_OUTPUT"
31
+ elif echo "$FIRST_LINE" | grep -qE '^(fix|docs|refactor|chore|style|perf|test|ci|build|revert)(\(.+\))?:'; then
32
+ echo "bump=patch" >> "$GITHUB_OUTPUT"
33
+ else
34
+ echo "bump=" >> "$GITHUB_OUTPUT"
35
+ fi
36
+
37
+ - name: Skip if no conventional commit
38
+ if: steps.detect.outputs.bump == ''
39
+ run: echo "No conventional commit prefix detected — skipping version bump."
40
+
41
+ - uses: actions/checkout@v4
42
+ if: steps.detect.outputs.bump != ''
43
+ with:
44
+ fetch-depth: 0
45
+
46
+ - uses: astral-sh/setup-uv@v3
47
+ if: steps.detect.outputs.bump != ''
48
+ with:
49
+ version: "latest"
50
+
51
+ - name: Set up Python
52
+ if: steps.detect.outputs.bump != ''
53
+ run: uv python install 3.13
54
+
55
+ - name: Install dependencies
56
+ if: steps.detect.outputs.bump != ''
57
+ run: uv sync --all-extras
58
+
59
+ - name: Configure git
60
+ if: steps.detect.outputs.bump != ''
61
+ run: |
62
+ git config user.name "github-actions[bot]"
63
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
64
+
65
+ - name: Bump version
66
+ if: steps.detect.outputs.bump != ''
67
+ run: uv run python scripts/auto_version.py ${{ steps.detect.outputs.bump }}
68
+
69
+ - name: Push commit and tag
70
+ if: steps.detect.outputs.bump != ''
71
+ run: |
72
+ git push
73
+ git push --tags
@@ -0,0 +1,71 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ lint:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: astral-sh/setup-uv@v3
15
+ with:
16
+ version: "latest"
17
+ - name: Set up Python
18
+ run: uv python install 3.13
19
+ - name: Install dependencies
20
+ run: uv sync --all-extras
21
+ - name: Lint with ruff
22
+ run: uv run ruff check src/ tests/
23
+ - name: Format check with ruff
24
+ run: uv run ruff format --check src/ tests/
25
+
26
+ typecheck:
27
+ runs-on: ubuntu-latest
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ - uses: astral-sh/setup-uv@v3
31
+ with:
32
+ version: "latest"
33
+ - name: Set up Python
34
+ run: uv python install 3.13
35
+ - name: Install dependencies
36
+ run: uv sync --all-extras
37
+ - name: Type check with mypy
38
+ run: uv run mypy src/ --strict
39
+
40
+ test:
41
+ runs-on: ubuntu-latest
42
+ strategy:
43
+ matrix:
44
+ python-version: ["3.11", "3.12", "3.13"]
45
+ steps:
46
+ - uses: actions/checkout@v4
47
+ - uses: astral-sh/setup-uv@v3
48
+ with:
49
+ version: "latest"
50
+ - name: Set up Python ${{ matrix.python-version }}
51
+ run: uv python install ${{ matrix.python-version }}
52
+ - name: Install dependencies
53
+ run: uv sync --all-extras
54
+ - name: Configure git
55
+ run: |
56
+ git config --global user.email "test@wade.dev"
57
+ git config --global user.name "wade test"
58
+ git config --global init.defaultBranch main
59
+ - name: Run unit tests
60
+ run: ./scripts/test.sh tests/unit/
61
+ - name: Run integration tests
62
+ run: ./scripts/test.sh tests/integration/
63
+ - name: Run top-level CLI contract smoke
64
+ run: ./scripts/test.sh tests/test_cli_basics.py
65
+
66
+ e2e_docker:
67
+ runs-on: ubuntu-latest
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+ - name: Run deterministic e2e contract tests in Docker
71
+ run: ./scripts/test-e2e-docker.sh
@@ -0,0 +1,31 @@
1
+ name: PR Title Lint
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, edited, synchronize, reopened]
6
+ branches: [main]
7
+
8
+ permissions:
9
+ pull-requests: read
10
+
11
+ jobs:
12
+ lint-title:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: amannn/action-semantic-pull-request@v5
16
+ env:
17
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
18
+ with:
19
+ types: |
20
+ feat
21
+ fix
22
+ docs
23
+ refactor
24
+ chore
25
+ style
26
+ perf
27
+ test
28
+ ci
29
+ build
30
+ revert
31
+ update
@@ -0,0 +1,48 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ *.egg
7
+ dist/
8
+ build/
9
+ .eggs/
10
+
11
+ # Virtual environments
12
+ .venv/
13
+ venv/
14
+ env/
15
+
16
+ # IDE
17
+ .idea/
18
+ .vscode/
19
+ *.swp
20
+ *.swo
21
+
22
+ # Testing
23
+ .pytest_cache/
24
+ .coverage
25
+ htmlcov/
26
+ .mypy_cache/
27
+
28
+ # AI tool directories (wade-managed — never committed in this repo)
29
+ .agents/
30
+ .claude/
31
+ .copilot/
32
+ .cursor/
33
+ .gemini/
34
+ .github/hooks/
35
+ .github/skills
36
+ CLAUDE.md
37
+ PLAN.md
38
+ PR-SUMMARY.md
39
+
40
+ # OS
41
+ .DS_Store
42
+ Thumbs.db
43
+
44
+ # uv
45
+ uv.lock
46
+
47
+ # Local archive (pre-reset export)
48
+ archive/
@@ -0,0 +1,26 @@
1
+ repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.15.2
4
+ hooks:
5
+ - id: ruff
6
+ args: [--fix]
7
+ - id: ruff-format
8
+
9
+ - repo: local
10
+ hooks:
11
+ - id: mypy
12
+ name: mypy
13
+ language: system
14
+ entry: uv run mypy --strict src/
15
+ pass_filenames: false
16
+ always_run: true
17
+
18
+ - repo: https://github.com/pre-commit/pre-commit-hooks
19
+ rev: v5.0.0
20
+ hooks:
21
+ - id: trailing-whitespace
22
+ - id: end-of-file-fixer
23
+ - id: check-yaml
24
+ - id: check-added-large-files
25
+ args: [--maxkb=500]
26
+ - id: check-merge-conflict
@@ -0,0 +1,66 @@
1
+ version: 2
2
+ project:
3
+ main_branch: main
4
+ issue_label: feature-plan
5
+ worktrees_dir: ../.worktrees
6
+ branch_prefix: feat
7
+ merge_strategy: PR
8
+ ai:
9
+ default_tool: claude
10
+ default_model: claude-sonnet-4.6
11
+ effort: max
12
+ plan:
13
+ tool: claude
14
+ model: claude-opus-4.7
15
+ effort: xhigh
16
+ yolo: true
17
+ deps:
18
+ tool: copilot
19
+ model: claude-sonnet-4.6
20
+ mode: headless
21
+ yolo: false
22
+ review_plan:
23
+ tool: copilot
24
+ model: claude-sonnet-4.6
25
+ mode: headless
26
+ enabled: true
27
+ yolo: false
28
+ review_implementation:
29
+ tool: copilot
30
+ model: claude-sonnet-4.6
31
+ mode: headless
32
+ enabled: true
33
+ yolo: false
34
+ review_batch:
35
+ tool: copilot
36
+ model: claude-sonnet-4.6
37
+ mode: interactive
38
+ enabled: true
39
+ yolo: true
40
+ yolo: true
41
+ models:
42
+ claude:
43
+ easy:
44
+ model: claude-sonnet-4.6
45
+ effort: xhigh
46
+ medium:
47
+ model: claude-sonnet-4.6
48
+ effort: max
49
+ complex:
50
+ model: claude-opus-4.7
51
+ effort: high
52
+ very_complex:
53
+ model: claude-opus-4.7
54
+ effort: xhigh
55
+ provider:
56
+ name: github
57
+ knowledge:
58
+ enabled: true
59
+ path: KNOWLEDGE.md
60
+ hooks:
61
+ post_worktree_create: scripts/setup-worktree.sh
62
+ copy_to_worktree:
63
+ - .env
64
+ - .wade.yml
65
+ - KNOWLEDGE.md
66
+ - KNOWLEDGE.ratings.yml
@@ -0,0 +1,144 @@
1
+ # AGENTS.md
2
+
3
+ This file provides guidance to AI agents working on the WADE codebase.
4
+ For detailed reference on specific topics, see `docs/dev/`.
5
+
6
+ ## Project Overview
7
+
8
+ **WADE** (Workflow for AI-Driven Engineering) is a Python CLI toolkit for AI-agent-driven git workflow management. It wraps `gh` CLI and native git to manage GitHub Issues as tasks, git worktrees for isolated development, branch safety checks, and installable Agent Skill files. CLI entry point: **`wade`**.
9
+
10
+ ## Terminology
11
+
12
+ Two distinct worlds interact in this codebase. Always be clear which one you are working in:
13
+
14
+ | Term | Meaning |
15
+ |------|---------|
16
+ | **the WADE repo** / **this project** | This source repository — `src/wade/`, `templates/`, `tests/`, `scripts/` |
17
+ | **inited project** / **target project** | Any third-party repo that has run `wade init` to adopt the workflow |
18
+ | **skill templates** | Markdown files in `templates/skills/` — the source of truth, part of the WADE repo |
19
+ | **installed skills** | Copies (or symlinks) of skill templates placed in a project's `.claude/skills/` by `wade init` |
20
+ | **AGENTS.md pointer** | A short `## Git Workflow` block that `wade init` injects into an inited project's `AGENTS.md` |
21
+
22
+ **This `AGENTS.md` governs development of WADE itself.** Skills, the pointer, and the progressive disclosure architecture are all *outputs* of WADE — artifacts installed into inited projects, not rules for developing WADE.
23
+
24
+ **WADE uses its own workflow.** This repo is itself an inited project. Follow the `## Git Workflow` pointer at the bottom and the phase-specific skill referenced in your clipboard prompt.
25
+
26
+ ## Commands
27
+
28
+ > **AI agents: always run the scripts below — never improvise raw `uv run pytest` / `mypy` / `ruff` calls.**
29
+
30
+ | Script | Purpose |
31
+ |--------|---------|
32
+ | `./scripts/test.sh` | Run all tests (excludes live) |
33
+ | `./scripts/test.sh tests/unit/` | Unit tests only |
34
+ | `./scripts/test-e2e.sh` | Deterministic E2E contract tests (host lane) |
35
+ | `./scripts/test-e2e-docker.sh` | Deterministic E2E contract tests in Docker (CI-equivalent) |
36
+ | `./scripts/check.sh` | Lint + type-check (both) |
37
+ | `./scripts/check.sh --lint` | Lint + format check only |
38
+ | `./scripts/check.sh --types` | Type check (strict mypy) only |
39
+ | `./scripts/fmt.sh` | Auto-format source in-place |
40
+ | `./scripts/check-all.sh` | Full checklist (test + check) |
41
+
42
+ ```bash
43
+ uv pip install -e ".[dev]" # Install for development
44
+ uv run python scripts/auto_version.py patch # Version bump (patch/minor/major)
45
+
46
+ # Version bumps MUST be done with the script above. NEVER bump pyproject.toml
47
+ # manually, as the script generates CHANGELOG.md and git tags automatically.
48
+ ```
49
+
50
+ > Full commands reference: see `docs/dev/architecture.md`
51
+
52
+ ## Architecture
53
+
54
+ ```
55
+ CLI Layer -> can import: services, models, config, logging, ui
56
+ Service Layer -> can import: providers, ai_tools, git, db, models, config, logging
57
+ Provider Layer -> can import: models, config, logging (NO service imports)
58
+ AI Tool Layer -> can import: models, config, logging (NO service imports)
59
+ Git Layer -> can import: models, config, logging (NO service imports)
60
+ DB Layer -> can import: models, logging (NO config imports)
61
+ Models Layer -> can import: nothing (leaf dependency)
62
+ ```
63
+
64
+ No circular dependencies. Models are pure data. Services orchestrate. **Never import a higher layer from a lower layer.**
65
+
66
+ CLI modules are thin dispatch — they parse flags via Typer, then call service methods. Business logic lives in `services/`, not in `cli/`.
67
+
68
+ > Full package structure, command dispatch, config system, and subsystem details: see `docs/dev/architecture.md`
69
+
70
+ ### Key Design Patterns
71
+
72
+ - **AI Tool Self-Registration**: `AbstractAITool.__init_subclass__` auto-registers adapters. Adding a new AI tool = one file, one class.
73
+ - **Provider Abstraction**: `AbstractTaskProvider` ABC with pluggable backends (GitHub via `gh` CLI, ClickUp via REST API, Markdown via a single central file). Non-GitHub providers compose `GitHubPRDelegateMixin` so PR-review APIs still flow through `gh`.
74
+ - **Prompts as .md Templates**: All AI prompts live in `templates/prompts/`, not inline strings.
75
+ - **Synchronous Only**: No asyncio. Process-level parallelism via multiple terminals.
76
+ - **Pydantic Everywhere**: All data structures are Pydantic `BaseModel` subclasses, not dicts.
77
+
78
+ ## Design Principles
79
+
80
+ ### Determinism via Services
81
+
82
+ All deterministic operations — git commands, state transitions, file manipulation, API calls — **must live in service/utility code**, never in AI agent reasoning.
83
+
84
+ - **Code decides and executes** — fetch, merge, branch creation, worktree lifecycle, issue state changes. Codified in `services/`, `git/`, `providers/`.
85
+ - **Agents interpret and decide** — reading conflict diffs, choosing resolution strategies, composing commit messages. Guided by skills.
86
+
87
+ **Test**: "Can an AI agent get this wrong by reasoning about it?" If yes, put it in code.
88
+
89
+ ### Two Worlds
90
+
91
+ Everything in this repo exists in one of two worlds:
92
+
93
+ | WADE repo (source) | Inited project (output) |
94
+ |---------------------|------------------------|
95
+ | `src/wade/` | installed `wade` binary |
96
+ | `templates/skills/<name>/SKILL.md` | `.claude/skills/<name>/SKILL.md` |
97
+ | `templates/agents-pointer.md` | `## Git Workflow` block in target `AGENTS.md` |
98
+ | `AGENTS.md` (this file) | target project's own `AGENTS.md` |
99
+
100
+ When developing WADE, **only touch the left column**. Always edit `templates/skills/<name>/SKILL.md` directly — never edit files inside `.claude/skills/` (those are symlinks in this repo, copies in inited projects).
101
+
102
+ > Skills system deep dive (symlinks, pointer markers, installation lifecycle): see `docs/dev/skills-system.md`
103
+
104
+ ## Conventions
105
+
106
+ ### Naming
107
+
108
+ - **Modules**: `snake_case.py` — one module per concern
109
+ - **Classes**: `PascalCase` — Pydantic models, ABCs, adapters
110
+ - **Functions**: `snake_case` — `_` prefix for private helpers
111
+ - **Constants**: `UPPER_SNAKE_CASE`
112
+ - **Enums**: `StrEnum` for string-valued enums
113
+ - **CLI commands**: top-level commands (`wade plan`, `wade implement`)
114
+
115
+ ### Commits
116
+
117
+ Use [Conventional Commits](https://www.conventionalcommits.org/):
118
+ `feat:` (minor), `fix:` (patch), `docs:` (patch), `refactor:` (patch),
119
+ `test:` (patch), `chore:` (patch). Breaking changes (`feat!:`) -> major.
120
+
121
+ ## Change Checklist
122
+
123
+ Before considering any work complete:
124
+
125
+ - [ ] **Code** — `./scripts/test.sh` passes
126
+ - [ ] **Types + Lint** — `./scripts/check.sh` passes (or run both at once: `./scripts/check-all.sh`)
127
+ - [ ] **`AGENTS.md`** — updated if architecture, conventions, or workflow changed
128
+ - [ ] **`README.md`** — updated if user-facing behavior changed
129
+ - [ ] **`templates/skills/`** — updated if agent-facing rules changed (plan-session for planning, implementation-session for implementation, review-pr-comments-session for reviews)
130
+ - [ ] **Commit** — uses conventional-commit prefix
131
+
132
+ > Full 10-item checklist, documentation rules, feedback loop, and correction-driven docs: see `docs/dev/documentation-policies.md`
133
+
134
+ ## Detailed Reference
135
+
136
+ Read these on-demand when working in a specific area:
137
+
138
+ | When you are... | Read |
139
+ |-----------------|------|
140
+ | Modifying architecture, config, or commands | `docs/dev/architecture.md` |
141
+ | Adding an AI tool, provider, or subcommand | `docs/dev/extending.md` |
142
+ | Writing or running tests | `docs/dev/testing.md` |
143
+ | Working on skills, pointer system, or `wade init` | `docs/dev/skills-system.md` |
144
+ | Updating documentation policies | `docs/dev/documentation-policies.md` |