wade-cli 0.54.2__tar.gz → 1.1.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 (420) hide show
  1. {wade_cli-0.54.2 → wade_cli-1.1.0}/CHANGELOG.md +22 -0
  2. {wade_cli-0.54.2 → wade_cli-1.1.0}/KNOWLEDGE.md +84 -0
  3. {wade_cli-0.54.2 → wade_cli-1.1.0}/KNOWLEDGE.ratings.jsonl +18 -0
  4. {wade_cli-0.54.2 → wade_cli-1.1.0}/PKG-INFO +198 -55
  5. {wade_cli-0.54.2 → wade_cli-1.1.0}/README.md +196 -53
  6. {wade_cli-0.54.2 → wade_cli-1.1.0}/docs/dev/architecture.md +259 -45
  7. {wade_cli-0.54.2 → wade_cli-1.1.0}/docs/dev/extending.md +16 -0
  8. {wade_cli-0.54.2 → wade_cli-1.1.0}/pyproject.toml +2 -2
  9. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/changelog.py +93 -9
  10. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/__init__.py +1 -1
  11. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/main.py +42 -23
  12. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/review.py +34 -5
  13. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/task.py +7 -0
  14. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/config/loader.py +7 -2
  15. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/config/migrations.py +57 -0
  16. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/config.py +31 -34
  17. wade_cli-1.1.0/src/wade/models/delegation.py +101 -0
  18. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/session_manifest.py +6 -0
  19. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/ai_resolution.py +252 -31
  20. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/batch_review_service.py +9 -0
  21. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/check_service.py +72 -19
  22. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/delegation_service.py +213 -47
  23. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/deps_service.py +46 -4
  24. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/batch.py +42 -14
  25. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/bootstrap.py +21 -2
  26. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/core.py +134 -81
  27. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/lifecycle.py +9 -9
  28. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/plan_service.py +79 -9
  29. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/review_delegation_service.py +249 -15
  30. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/review_record_service.py +33 -16
  31. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/review_service.py +144 -58
  32. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/smart_start.py +15 -11
  33. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/filelock.py +16 -3
  34. wade_cli-1.1.0/src/wade/utils/runtime_env.py +316 -0
  35. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/conftest.py +19 -0
  36. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_implement_work_done_contract.py +72 -0
  37. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_plan_contract.py +31 -0
  38. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_review_contract.py +233 -0
  39. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_review_cli.py +39 -1
  40. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_session_subapps.py +10 -1
  41. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_task_cli.py +20 -0
  42. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_work_cli.py +10 -3
  43. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/test_loader.py +32 -19
  44. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/test_migrations.py +105 -0
  45. wade_cli-1.1.0/tests/unit/test_scripts/__init__.py +1 -0
  46. wade_cli-1.1.0/tests/unit/test_scripts/test_changelog.py +65 -0
  47. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_ai_resolution.py +336 -52
  48. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_batch_build_cmd.py +47 -17
  49. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_batch_review_service.py +7 -2
  50. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bootstrap_allowlist.py +76 -1
  51. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_check.py +59 -9
  52. wade_cli-1.1.0/tests/unit/test_services/test_codex_worktree_launch_context.py +288 -0
  53. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_delegation_service.py +385 -1
  54. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_deps_service.py +62 -2
  55. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_done_gates.py +48 -0
  56. wade_cli-1.1.0/tests/unit/test_services/test_implementation_launch_context.py +473 -0
  57. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_implementation_service.py +61 -8
  58. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_plan_service.py +45 -1
  59. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_post_implementation_lifecycle.py +6 -6
  60. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_review_delegation_service.py +215 -1
  61. wade_cli-1.1.0/tests/unit/test_services/test_review_receipts.py +497 -0
  62. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_review_records.py +44 -0
  63. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_review_service.py +311 -27
  64. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_smart_start.py +90 -10
  65. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_crossby_contract.py +1 -1
  66. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_filelock.py +10 -0
  67. wade_cli-1.1.0/tests/unit/test_utils/test_runtime_env.py +252 -0
  68. wade_cli-0.54.2/src/wade/models/delegation.py +0 -61
  69. wade_cli-0.54.2/tests/unit/test_services/test_codex_worktree_launch_context.py +0 -144
  70. wade_cli-0.54.2/tests/unit/test_services/test_implementation_launch_context.py +0 -318
  71. wade_cli-0.54.2/tests/unit/test_services/test_review_receipts.py +0 -223
  72. {wade_cli-0.54.2 → wade_cli-1.1.0}/.gitattributes +0 -0
  73. {wade_cli-0.54.2 → wade_cli-1.1.0}/.github/workflows/auto-version.yml +0 -0
  74. {wade_cli-0.54.2 → wade_cli-1.1.0}/.github/workflows/ci.yml +0 -0
  75. {wade_cli-0.54.2 → wade_cli-1.1.0}/.github/workflows/pr-title-lint.yml +0 -0
  76. {wade_cli-0.54.2 → wade_cli-1.1.0}/.github/workflows/publish.yml +0 -0
  77. {wade_cli-0.54.2 → wade_cli-1.1.0}/.github/workflows/release.yml +0 -0
  78. {wade_cli-0.54.2 → wade_cli-1.1.0}/.gitignore +0 -0
  79. {wade_cli-0.54.2 → wade_cli-1.1.0}/.pre-commit-config.yaml +0 -0
  80. {wade_cli-0.54.2 → wade_cli-1.1.0}/.wade.yml +0 -0
  81. {wade_cli-0.54.2 → wade_cli-1.1.0}/AGENTS.md +0 -0
  82. {wade_cli-0.54.2 → wade_cli-1.1.0}/CONTRIBUTING.md +0 -0
  83. {wade_cli-0.54.2 → wade_cli-1.1.0}/assets/wade.png +0 -0
  84. {wade_cli-0.54.2 → wade_cli-1.1.0}/docker-compose.e2e.yml +0 -0
  85. {wade_cli-0.54.2 → wade_cli-1.1.0}/docs/dev/documentation-policies.md +0 -0
  86. {wade_cli-0.54.2 → wade_cli-1.1.0}/docs/dev/skills-system.md +0 -0
  87. {wade_cli-0.54.2 → wade_cli-1.1.0}/docs/dev/testing.md +0 -0
  88. {wade_cli-0.54.2 → wade_cli-1.1.0}/docs/dev/workflows-and-skills.md +0 -0
  89. {wade_cli-0.54.2 → wade_cli-1.1.0}/install.sh +0 -0
  90. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/auto_version.py +0 -0
  91. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/check-all.sh +0 -0
  92. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/check.sh +0 -0
  93. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/fmt.sh +0 -0
  94. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/hooks/pre-push +0 -0
  95. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/install-hooks.sh +0 -0
  96. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/release.sh +0 -0
  97. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/setup-worktree.sh +0 -0
  98. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test-concurrency.sh +0 -0
  99. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test-e2e-docker.sh +0 -0
  100. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test-e2e.sh +0 -0
  101. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test-live-ai-taskr.sh +0 -0
  102. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test-live-ai.sh +0 -0
  103. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test-live-gh.sh +0 -0
  104. {wade_cli-0.54.2 → wade_cli-1.1.0}/scripts/test.sh +0 -0
  105. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/__main__.py +0 -0
  106. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/__init__.py +0 -0
  107. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/admin.py +0 -0
  108. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/autocomplete.py +0 -0
  109. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/deps_session.py +0 -0
  110. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/hook.py +0 -0
  111. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/implementation_session.py +0 -0
  112. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/knowledge.py +0 -0
  113. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/plan_session.py +0 -0
  114. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/review_pr_comments_session.py +0 -0
  115. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/session.py +0 -0
  116. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/session_shared.py +0 -0
  117. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/skills.py +0 -0
  118. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/cli/worktree.py +0 -0
  119. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/config/__init__.py +0 -0
  120. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/config/schema.py +0 -0
  121. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/__init__.py +0 -0
  122. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/branch.py +0 -0
  123. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/hooks.py +0 -0
  124. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/pr.py +0 -0
  125. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/repo.py +0 -0
  126. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/stash.py +0 -0
  127. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/sync.py +0 -0
  128. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/git/worktree.py +0 -0
  129. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/hooks/__init__.py +0 -0
  130. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/hooks/cli.py +0 -0
  131. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/hooks/policies.py +0 -0
  132. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/logging/__init__.py +0 -0
  133. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/logging/context.py +0 -0
  134. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/logging/setup.py +0 -0
  135. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/__init__.py +0 -0
  136. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/batch.py +0 -0
  137. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/deps.py +0 -0
  138. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/events.py +0 -0
  139. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/hooks.py +0 -0
  140. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/permission.py +0 -0
  141. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/readiness.py +0 -0
  142. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/review.py +0 -0
  143. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/session.py +0 -0
  144. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/skill.py +0 -0
  145. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/task.py +0 -0
  146. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/workflow.py +0 -0
  147. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/models/worktree.py +0 -0
  148. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/__init__.py +0 -0
  149. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/_pr_delegate.py +0 -0
  150. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/base.py +0 -0
  151. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/clickup.py +0 -0
  152. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/github.py +0 -0
  153. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/markdown.py +0 -0
  154. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/providers/registry.py +0 -0
  155. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/__init__.py +0 -0
  156. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/bot_trigger.py +0 -0
  157. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/documentation_receipt_service.py +0 -0
  158. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/__init__.py +0 -0
  159. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/_shared.py +0 -0
  160. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/cleanup.py +0 -0
  161. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/done.py +0 -0
  162. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/draft_pr.py +0 -0
  163. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/sync.py +0 -0
  164. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/implementation_service/usage_tracking.py +0 -0
  165. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/__init__.py +0 -0
  166. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/auth.py +0 -0
  167. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/commands.py +0 -0
  168. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/config_io.py +0 -0
  169. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/manifest.py +0 -0
  170. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/migrations.py +0 -0
  171. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/prompts_ai.py +0 -0
  172. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/prompts_setup.py +0 -0
  173. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/init_service/shell.py +0 -0
  174. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/knowledge_recovery.py +0 -0
  175. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/knowledge_search.py +0 -0
  176. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/knowledge_service.py +0 -0
  177. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/prompt_delivery.py +0 -0
  178. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/review_settle.py +0 -0
  179. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/session_composition_service.py +0 -0
  180. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/skill_diagnostics_service.py +0 -0
  181. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/skill_invocation_service.py +0 -0
  182. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/services/task_service.py +0 -0
  183. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/__init__.py +0 -0
  184. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/catalog.py +0 -0
  185. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/discovery.py +0 -0
  186. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/doc_targets.py +0 -0
  187. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/installer.py +0 -0
  188. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/materializer.py +0 -0
  189. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/pointer.py +0 -0
  190. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/resolver.py +0 -0
  191. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/skills/validation.py +0 -0
  192. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/ui/__init__.py +0 -0
  193. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/ui/console.py +0 -0
  194. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/ui/prompts.py +0 -0
  195. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/__init__.py +0 -0
  196. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/body_markers.py +0 -0
  197. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/clipboard.py +0 -0
  198. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/conventional.py +0 -0
  199. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/gitref.py +0 -0
  200. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/http.py +0 -0
  201. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/install.py +0 -0
  202. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/knowledge_file.py +0 -0
  203. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/markdown.py +0 -0
  204. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/markers.py +0 -0
  205. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/paths.py +0 -0
  206. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/plan_validation.py +0 -0
  207. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/process.py +0 -0
  208. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/safe_state.py +0 -0
  209. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/slug.py +0 -0
  210. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/stale_base.py +0 -0
  211. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/templates.py +0 -0
  212. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/terminal.py +0 -0
  213. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/token_usage_markdown.py +0 -0
  214. {wade_cli-0.54.2 → wade_cli-1.1.0}/src/wade/utils/update_check.py +0 -0
  215. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/agents-pointer.md +0 -0
  216. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/hooks/commit-msg +0 -0
  217. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/hooks/pre-commit +0 -0
  218. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/hooks/pre-push +0 -0
  219. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/deps-analysis.md +0 -0
  220. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/implement-context.md +0 -0
  221. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/plan-session.md +0 -0
  222. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/review-batch.md +0 -0
  223. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/review-code.md +0 -0
  224. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/review-plan.md +0 -0
  225. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/review-pr-comments.md +0 -0
  226. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/session-start-implement.md +0 -0
  227. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/session-start-plan.md +0 -0
  228. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/prompts/session-start-review.md +0 -0
  229. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/setup-worktree.sh.example +0 -0
  230. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/batch-review/SKILL.md +0 -0
  231. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/code-review/SKILL.md +0 -0
  232. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/dependency-analysis/SKILL.md +0 -0
  233. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/implementation/SKILL.md +0 -0
  234. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/knowledge/SKILL.md +0 -0
  235. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/plan-review/SKILL.md +0 -0
  236. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/planning/SKILL.md +0 -0
  237. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/review-comments/SKILL.md +0 -0
  238. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/task/SKILL.md +0 -0
  239. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/task/examples.md +0 -0
  240. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/task/plan-format.md +0 -0
  241. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/skills/task/reference/session-summary-format.md +0 -0
  242. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/statusline-command.sh +0 -0
  243. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/_partials/completion.md +0 -0
  244. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/_partials/documentation-step.md +0 -0
  245. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/_partials/interaction-policy.md +0 -0
  246. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/_partials/knowledge-step.md +0 -0
  247. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/_partials/review-budget.md +0 -0
  248. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/implementation.md +0 -0
  249. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/plan.md +0 -0
  250. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/documentation.md +0 -0
  251. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/new-plan.md +0 -0
  252. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/plan-output-contract.md +0 -0
  253. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/pr-summary-format.md +0 -0
  254. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/recovery.md +0 -0
  255. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/session-summary-format.md +0 -0
  256. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/reference/tracking-issues.md +0 -0
  257. {wade_cli-0.54.2 → wade_cli-1.1.0}/templates/workflows/review-pr-comments.md +0 -0
  258. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/__init__.py +0 -0
  259. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/concurrency/__init__.py +0 -0
  260. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/concurrency/test_batch_multi_pr.py +0 -0
  261. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/concurrency/test_knowledge_merge.py +0 -0
  262. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/concurrency/test_lock_retry.py +0 -0
  263. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/concurrency/test_stash_race.py +0 -0
  264. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/__init__.py +0 -0
  265. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/_support.py +0 -0
  266. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/conftest.py +0 -0
  267. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/mock_gh_script.py +0 -0
  268. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_admin_contract.py +0 -0
  269. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_check_contract.py +0 -0
  270. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_knowledge_contract.py +0 -0
  271. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_mock_gh_contract.py +0 -0
  272. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_smart_start_contract.py +0 -0
  273. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_task_contract.py +0 -0
  274. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/e2e/test_work_sync_list_contract.py +0 -0
  275. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/fixtures/live/taskr_header_hi_body.md +0 -0
  276. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/fixtures/live/taskr_header_howdy_body.md +0 -0
  277. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/fixtures/transcripts/claude_session.txt +0 -0
  278. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/fixtures/transcripts/codex_session.txt +0 -0
  279. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/fixtures/transcripts/copilot_session.txt +0 -0
  280. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/fixtures/transcripts/generic_session.txt +0 -0
  281. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/__init__.py +0 -0
  282. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_autostash.py +0 -0
  283. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_check.py +0 -0
  284. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_dynamic_skill_sessions.py +0 -0
  285. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_git.py +0 -0
  286. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_implementation_lifecycle.py +0 -0
  287. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_init.py +0 -0
  288. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_knowledge.py +0 -0
  289. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_markdown_provider.py +0 -0
  290. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_skill_context_budget.py +0 -0
  291. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/integration/test_skill_install.py +0 -0
  292. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/live/__init__.py +0 -0
  293. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/live/test_wade_live_ai.py +0 -0
  294. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/live/test_wade_live_ai_taskr.py +0 -0
  295. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/live/test_wade_live_gh.py +0 -0
  296. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/test_cli_basics.py +0 -0
  297. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/__init__.py +0 -0
  298. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/conftest.py +0 -0
  299. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/__init__.py +0 -0
  300. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_autocomplete.py +0 -0
  301. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_done_doc_pass_advisory.py +0 -0
  302. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_done_review_hint.py +0 -0
  303. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_knowledge_cli.py +0 -0
  304. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_shell_init.py +0 -0
  305. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_skills_session_cli.py +0 -0
  306. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_cli/test_work_ai_flags.py +0 -0
  307. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/__init__.py +0 -0
  308. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/test_bot_review_config.py +0 -0
  309. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/test_dynamic_skill_config.py +0 -0
  310. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/test_merge_strategy_migration.py +0 -0
  311. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_config/test_migrations_atomic.py +0 -0
  312. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_console.py +0 -0
  313. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_effort.py +0 -0
  314. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/__init__.py +0 -0
  315. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_all_patches_present.py +0 -0
  316. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_branch_list.py +0 -0
  317. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_branch_slugify.py +0 -0
  318. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_detached_worktree.py +0 -0
  319. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_is_merged_into.py +0 -0
  320. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_main_checkout_root.py +0 -0
  321. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_merge_count.py +0 -0
  322. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_pr_base.py +0 -0
  323. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_pr_lookup.py +0 -0
  324. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_pr_retry.py +0 -0
  325. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_pr_title.py +0 -0
  326. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_repo.py +0 -0
  327. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_reset_branch.py +0 -0
  328. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_scaffold_commit.py +0 -0
  329. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_stash_drop.py +0 -0
  330. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_sync_conflicted_files.py +0 -0
  331. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_tip_commit_is_empty.py +0 -0
  332. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_git/test_worktree_remove.py +0 -0
  333. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_hooks/__init__.py +0 -0
  334. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_hooks/test_hook_cli.py +0 -0
  335. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_hooks/test_policies.py +0 -0
  336. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_hooks/test_post_tool_use.py +0 -0
  337. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_hooks/test_session_start.py +0 -0
  338. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/__init__.py +0 -0
  339. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_batch.py +0 -0
  340. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_config_models.py +0 -0
  341. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_delegation.py +0 -0
  342. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_deps_models.py +0 -0
  343. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_deps_partition.py +0 -0
  344. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_review.py +0 -0
  345. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_review_expectation.py +0 -0
  346. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_task_models.py +0 -0
  347. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_models/test_workflow_models.py +0 -0
  348. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_permission_mode.py +0 -0
  349. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_providers/__init__.py +0 -0
  350. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_providers/test_clickup.py +0 -0
  351. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_providers/test_github.py +0 -0
  352. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_providers/test_github_pr.py +0 -0
  353. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_providers/test_markdown.py +0 -0
  354. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/__init__.py +0 -0
  355. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_batch_pr_index.py +0 -0
  356. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bootstrap_guard_matcher.py +0 -0
  357. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bootstrap_hook_timeout.py +0 -0
  358. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bootstrap_post_tool_use.py +0 -0
  359. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bootstrap_pre_push.py +0 -0
  360. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bootstrap_session_start.py +0 -0
  361. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_bot_trigger.py +0 -0
  362. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_catchup.py +0 -0
  363. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_catchup_reconcile.py +0 -0
  364. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_cleanup_loss_guard.py +0 -0
  365. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_documentation_receipt.py +0 -0
  366. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_done_idempotent.py +0 -0
  367. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_done_plan_flag.py +0 -0
  368. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_done_pr_title_sync.py +0 -0
  369. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_draft_pr_base_fetch.py +0 -0
  370. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_draft_pr_retarget.py +0 -0
  371. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_implementation_done_sync.py +0 -0
  372. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_implementation_service_resume.py +0 -0
  373. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_init.py +0 -0
  374. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_init_shell_integration.py +0 -0
  375. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_knowledge_recovery.py +0 -0
  376. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_knowledge_search.py +0 -0
  377. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_knowledge_service.py +0 -0
  378. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_managed_git_hooks.py +0 -0
  379. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_no_direct_git.py +0 -0
  380. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_poll_for_reviews.py +0 -0
  381. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_pr_lookup_guards.py +0 -0
  382. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_pr_summary_path.py +0 -0
  383. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_pre_push_backstop.py +0 -0
  384. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_preserve_session_data.py +0 -0
  385. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_prompt_delivery.py +0 -0
  386. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_push_recovery.py +0 -0
  387. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_resolve_task_branch.py +0 -0
  388. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_resume_autonomy.py +0 -0
  389. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_review_status_block.py +0 -0
  390. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_skill_diagnostics_service.py +0 -0
  391. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_smart_start_resume.py +0 -0
  392. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_stale_base_surface.py +0 -0
  393. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_sync_base_branch.py +0 -0
  394. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_task_service.py +0 -0
  395. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_tracked_managed_files.py +0 -0
  396. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_services/test_worktree_gitignore.py +0 -0
  397. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_doc_targets.py +0 -0
  398. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_dynamic_skills.py +0 -0
  399. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_generic_builtin_boundaries.py +0 -0
  400. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_knowledge_attributes.py +0 -0
  401. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_managed_gitignore.py +0 -0
  402. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_pointer.py +0 -0
  403. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_skills/test_review_budget_partial.py +0 -0
  404. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/__init__.py +0 -0
  405. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_body_markers.py +0 -0
  406. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_conventional.py +0 -0
  407. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_gitref.py +0 -0
  408. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_http.py +0 -0
  409. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_install.py +0 -0
  410. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_markdown.py +0 -0
  411. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_markers.py +0 -0
  412. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_plan_validation.py +0 -0
  413. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_process.py +0 -0
  414. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_prompts.py +0 -0
  415. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_slug.py +0 -0
  416. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_stale_base.py +0 -0
  417. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_terminal.py +0 -0
  418. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_terminal_launch.py +0 -0
  419. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_utils/test_update_check.py +0 -0
  420. {wade_cli-0.54.2 → wade_cli-1.1.0}/tests/unit/test_yolo.py +0 -0
@@ -4,6 +4,23 @@ 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
+ ## [v1.1.0] — 2026-09-04
8
+
9
+ ### Features
10
+
11
+ - diagnose sandboxed parent runtimes and keep review gates closed (#481) (4440220)
12
+
13
+ ## [v1.0.0] — 2026-09-03
14
+
15
+ ### Breaking Changes
16
+
17
+ - replace the Codex network pin with a cross-tool sandbox profile (#479) (7fa9561)
18
+ `ai.network_access` is retired and the AI runtime now launches **unsandboxed by default**. Set `ai.sandbox: true` to restore the previous confinement.
19
+
20
+ ### Features
21
+
22
+ - replace the Codex network pin with a cross-tool sandbox profile (#479) (7fa9561)
23
+
7
24
  ## [v0.54.2] — 2026-09-02
8
25
 
9
26
  ### Chores
@@ -415,6 +432,11 @@ The format is based on [Conventional Commits](https://conventionalcommits.org/).
415
432
 
416
433
  ## [v0.33.0] — 2026-07-23
417
434
 
435
+ ### Breaking Changes
436
+
437
+ - replace Gemini CLI support with Antigravity CLI (bump crossby to 0.10.x) (#336) (c54af6d)
438
+ Gemini CLI is no longer a supported AI tool. Projects with ai.default_tool: gemini (or a per-command tool: gemini) must switch to antigravity-cli or another supported tool.
439
+
418
440
  ### Features
419
441
 
420
442
  - replace Gemini CLI support with Antigravity CLI (bump crossby to 0.10.x) (#336) (c54af6d)
@@ -707,3 +707,87 @@ uv.lock is gitignored in this repo, so a crossby pin bump needs BOTH `uv lock` a
707
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
708
 
709
709
  ---
710
+
711
+ ## d7e3010043a2 | 2026-09-02 | implementation | tags: hooks, codex, gotcha, sandbox | Issue #478
712
+
713
+ `sandboxes_writes` is a STATIC crossby capability but the write boundary became launch-dependent once `ai.sandbox` existed (#478): it describes what a tool can do, not what this launch will do. Any code branching on it — today only `_install_guard_hooks` in `implementation_service/bootstrap.py` — must also consult the resolved profile, or under `sandbox=False` (Codex `--sandbox danger-full-access`) the worktree-containment guard narrows to the shell token and tool-call writes outside the worktree are guarded by nothing. Extends a44493f7, which documents the narrow-don't-skip rule but predates a disableable sandbox.
714
+
715
+ ---
716
+
717
+ ## 1c79175312c9 | 2026-09-02 | implementation | tags: config, validation, gotcha | Issue #478
718
+
719
+ check_service.py's AI-section key allowlists are derived reflectively from AICommandConfig/AIConfig.model_fields (#368), so DELETING a config field silently drops its key from the allowlist and the generic 'unsupported key' loop turns an un-migrated .wade.yml into a HARD ERROR — independent of any type validator, and in the opposite direction from the drift #368 fixed. Any key retirement needs an explicit tolerance entry (_DEPRECATED_AI_KEYS, added by #478) unioned into both allowlists for the transition release.
720
+
721
+ ---
722
+
723
+ ## 58e3be66cd66 | 2026-09-02 | implementation | tags: codex, yolo, sandbox | Issue #478
724
+
725
+ Codex --sandbox danger-full-access is APPROVAL-NEUTRAL: it is a distinct flag from --dangerously-bypass-approvals-and-sandbox, so disabling the runtime sandbox does not imply yolo and leaves the autonomy argv byte-identical. Sandbox and permission_mode stay orthogonal axes — one moves the OS boundary, the other the approval tier. Consistent with 1c18f1d4's separation of headless autonomy from permissions.
726
+
727
+ ---
728
+
729
+ ## 9eacd93219c1 | 2026-09-02 | implementation | tags: crossby, codex, gotcha | Issue #478
730
+
731
+ crossby's network_access parameter defaults to False and survived the #478 sandbox toggle, so wade must keep PASSING it (LAUNCH_NETWORK_ACCESS=True) rather than omitting it: a sandboxed launch that dropped the kwarg pins sandbox_workspace_write.network_access=false and silently takes the network away from the fetch/push/gh lifecycle that requires it. Under sandbox=False crossby short-circuits and ignores the value. This is why issue #478's 'no network_access kwarg reaches any adapter' criterion could not be met literally.
732
+
733
+ ---
734
+
735
+ ## ee8722fe7f27 | 2026-09-03 | implementation | tags: config, migration, gotcha | Issue #478
736
+
737
+ Config migrations in src/wade/config/migrations.py must test key PRESENCE, never the popped value: YAML `key:` with no value parses to None, so the natural `pop(key, None) is not None` idiom drops the key in memory while reporting 'unchanged'. That boolean is the only thing driving run_all_migrations' write-back, so a false 'unchanged' leaves the retired key on disk and any deprecation warning keyed to it recurs on every run. Use the _pop_if_present helper (#479) for any future key retirement.
738
+
739
+ ---
740
+
741
+ ## 6eb12fb5eb3a | 2026-09-03 | implementation | tags: tooling, git, gotcha | Issue #478
742
+
743
+ scripts/changelog.py's format_range is re-run by generate() for EVERY tag range in history, so anything per-commit inside it multiplies by the repo's whole commit count on each regeneration — the original per-commit `git log -1` body lookup would have meant thousands of subprocesses once footer-only breaking changes forced every body to be read. Pull extra commit fields from get_commits' single batched git log instead, with \x1f/\x1e field/record separators because bodies are multi-line free text that breaks any newline- or pipe-delimited format.
744
+
745
+ ---
746
+
747
+ ## ace2eb931e5e | 2026-09-03 | implementation | tags: release, ci, gotcha | Issue #478
748
+
749
+ The release version bump is derived from the PR title ALONE — .github/workflows/auto-version.yml greps only github.event.pull_request.title, never commit history — and done.py's PR-title sync overwrites that title from the ISSUE title on every done. So a `feat!:` commit with a real BREAKING CHANGE footer still ships as a MINOR release unless issue #N's own title carries the `!`; retitle the issue (gh issue edit --title, since wade task update only edits the body), not just the PR, or done reverts it.
750
+
751
+ ---
752
+
753
+ ## 1f23c00660aa | 2026-09-04 | implementation | tags: delegation, architecture, sandbox | Issue #480
754
+
755
+ `delegation_service.delegate()` is the single dispatcher for deps, standalone plan/code review, and batch review — `deps_service` and `review_delegation_service` call it directly and `batch_review_service` reaches it through the latter — so a cross-cutting launch concern belongs there ONCE, not per service. Centralising costs per-operation context, so remediation text must ride on `DelegationRequest` fields rather than being generated inside the dispatcher. `implementation_service/batch.py` is NOT a launch path: it builds ["wade", "implement", <id>] and spawns child `wade` processes that reach the `core.py` check themselves, so a check there is a dead no-op implying coverage it does not add.
756
+
757
+ ---
758
+
759
+ ## 280ed6e410b6 | 2026-09-04 | implementation | tags: delegation, sandbox, gotcha, error-handling | Issue #480
760
+
761
+ `DelegationResult.never_launched` means no process ever started (absent/unknown tool, `supports_headless` rejection, `CommandError` spawn failure, `OSError` on exec) — a non-zero exit AND a real timeout must both keep it False, because "relaunch the outer session" is wrong advice for a reviewer that actually ran. `utils.process.run` maps only `FileNotFoundError` to `CommandError`, so a `PermissionError` on a binary that resolves on PATH but cannot be executed escapes `_delegate_headless` entirely unless caught explicitly — one of the exact shapes an inherited sandbox produces. The interactive path needs an explicit `launched` flag because `adapter.launch` and the post-session output-file read share one exception handler.
762
+
763
+ ---
764
+
765
+ ## 65ee7eb64d81 | 2026-09-04 | implementation | tags: testing, sandbox, gotcha | Issue #480
766
+
767
+ `tests/conftest.py` carries an autouse fixture clearing `runtime_env.SANDBOX_SIGNAL_ENV_VARS`, because `utils/runtime_env.py` reads the REAL environment — without it a suite run from inside a sandboxed Codex session sees a genuine SANDBOXED verdict and takes relaunch/diagnosis branches no test asked for. It clears only the sandbox-signal vars, never the identity markers (`CODEX_CLI`, `CLAUDE_CODE`, …) that existing tests patch directly. Any test asserting on the parent-sandbox diagnosis must also clear competing identity markers, since the probe returns the FIRST one it recognises.
768
+
769
+ ---
770
+
771
+ ## 397994e37408 | 2026-09-04 | implementation | tags: delegation, error-handling, gotcha | Issue #480
772
+
773
+ `DelegationResult.never_launched` means no process ever started, and an explicit `launched` flag set after `adapter.launch()` returns is NOT enough to decide it: `launch` blocks until the child exits for most runtimes, so an adapter that checks the exit status raises `CalledProcessError` from a session that ran and failed. Classify the interactive launch boundary by exception SHAPE — an `OSError` at the spawn started nothing, every `subprocess.SubprocessError` variant carries a child that was created — and keep the post-launch section in its own handler. `utils.process.run` maps only `FileNotFoundError` to `CommandError`, so a `PermissionError` on a binary that resolves on PATH but cannot be executed escapes `_delegate_headless` unless caught explicitly.
774
+
775
+ ---
776
+
777
+ ## 12dd26da8910 | 2026-09-04 | implementation | tags: testing, gotcha, e2e | Issue #480
778
+
779
+ A non-executable file earlier on PATH does NOT make a later real binary unreachable: CPython builds an exec candidate from every PATH entry and keeps going past EACCES, so an E2E test that drops a chmod 644 stand-in into the mocked bin dir still runs the users real tool. To force a denial-shaped spawn failure, narrow PATH in the child env to the mocked bin plus only the dirs actually needed (`wade`, `git`, `/usr/bin`, `/bin`). `shutil.which` skips non-executables, so it is the right assertion that no real binary remains reachable.
780
+
781
+ ---
782
+
783
+ ## 4668ee29b835 | 2026-09-04 | implementation | tags: delegation, sandbox, batch | Issue #480
784
+
785
+ For issue #480, delegation_service.delegate() remains the one dispatcher for deps and standalone/batch reviews, but implement-batch crosses a different terminal-broker boundary. Diagnose a known parent sandbox once in implementation_service.batch before broker shells can lose its markers; child implementation checks remain a backstop, not the sole diagnosis.
786
+
787
+ ---
788
+
789
+ ## 54236b4243bc | 2026-09-04 | implementation | tags: testing, sandbox, gotcha | Issue #480
790
+
791
+ For issue #480 sandbox tests, the autouse conftest fixture clears both SANDBOX_SIGNAL_ENV_VARS and real Codex identity markers in CODEX_IDENTITY_ENV_VARS. Tests that need another enclosing runtime still set or clear competing identity markers deliberately; do not claim the fixture never clears identity markers.
792
+
793
+ ---
@@ -152,3 +152,21 @@
152
152
  {"dir": "up", "event_id": "0d0c898f52b54710a8d50b82cf78444a", "id": "a15045c3", "ts": "2026-09-02T15:22:03.529067+00:00"}
153
153
  {"dir": "up", "event_id": "417925753e00400a98e04c6a7d41ccc4", "id": "ae5df2be", "ts": "2026-09-02T15:39:33.320072+00:00"}
154
154
  {"dir": "up", "event_id": "a23ed60deb074def962f804a7ff9541a", "id": "fb2a067bb103", "ts": "2026-09-02T15:39:33.521027+00:00"}
155
+ {"dir": "up", "event_id": "e816bf9eda9842ffac928af977bd6ea3", "id": "a44493f7", "ts": "2026-09-02T22:00:41.291342+00:00"}
156
+ {"dir": "up", "event_id": "53071621625c4c40a2f7fded2f48467a", "id": "5b61c9c6", "ts": "2026-09-02T22:00:41.466441+00:00"}
157
+ {"dir": "up", "event_id": "980a8493a8bd42829e2a3057fa681c6a", "id": "fde883286787", "ts": "2026-09-02T22:00:41.632699+00:00"}
158
+ {"dir": "up", "event_id": "5cde95ece3844529a88448383c60e822", "id": "d7e3010043a2", "ts": "2026-09-03T02:07:17.166938+00:00"}
159
+ {"dir": "up", "event_id": "18179aae748f444487502929584aa632", "id": "6eb12fb5eb3a", "ts": "2026-09-03T12:24:58.444706+00:00"}
160
+ {"dir": "up", "event_id": "0c1be71273e34c50b609348a7c09622e", "id": "1c79175312c9", "ts": "2026-09-03T12:24:58.649116+00:00"}
161
+ {"dir": "up", "event_id": "67eb4181748e4cd2974a60ed014efe12", "id": "851bb6ec", "ts": "2026-09-04T11:02:22.496706+00:00"}
162
+ {"dir": "up", "event_id": "b15b9eba905749c78eded32f991397a1", "id": "d7e3010043a2", "ts": "2026-09-04T11:02:22.654506+00:00"}
163
+ {"dir": "stale", "event_id": "69e1b360de924aa5b0a27874d8be935e", "id": "8a9bfc96", "ts": "2026-09-04T11:02:22.809044+00:00"}
164
+ {"dir": "up", "event_id": "79dac0524f60401fb457dcb44c62ac5a", "id": "1f23c00660aa", "ts": "2026-09-04T14:17:48.792141+00:00"}
165
+ {"dir": "up", "event_id": "962d19cb9fa3460eb7f351bbdf0abe76", "id": "65ee7eb64d81", "ts": "2026-09-04T14:17:48.947672+00:00"}
166
+ {"id": "280ed6e410b6", "superseded_by": "397994e37408", "ts": "2026-09-04T14:18:00.060874+00:00"}
167
+ {"dir": "up", "event_id": "5aaf8dca23da43409dae899f50e04111", "id": "1f23c00660aa", "ts": "2026-09-04T16:19:49.643133+00:00"}
168
+ {"dir": "up", "event_id": "96bedf22dcd74c3cabdace8dd850f125", "id": "280ed6e410b6", "ts": "2026-09-04T16:19:49.795516+00:00"}
169
+ {"dir": "stale", "event_id": "de4b4ee2ffa24276a4b35d93ccb16b11", "id": "1f23c00660aa", "ts": "2026-09-04T22:14:03.557181+00:00"}
170
+ {"dir": "stale", "event_id": "71f6ebba04cc4c86bc4e2d02ed19ea9d", "id": "65ee7eb64d81", "ts": "2026-09-04T22:14:03.707575+00:00"}
171
+ {"id": "1f23c00660aa", "superseded_by": "4668ee29b835", "ts": "2026-09-04T22:14:10.938819+00:00"}
172
+ {"id": "65ee7eb64d81", "superseded_by": "54236b4243bc", "ts": "2026-09-04T22:14:17.907524+00:00"}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: wade-cli
3
- Version: 0.54.2
3
+ Version: 1.1.0
4
4
  Summary: WADE — Workflow for AI-Driven Engineering
5
5
  Project-URL: Homepage, https://github.com/ivanviragine/wade
6
6
  Project-URL: Repository, https://github.com/ivanviragine/wade
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Classifier: Programming Language :: Python :: 3.13
17
17
  Classifier: Topic :: Software Development :: Version Control :: Git
18
18
  Requires-Python: >=3.11
19
- Requires-Dist: crossby<0.29.0,>=0.28.0
19
+ Requires-Dist: crossby<0.30.0,>=0.29.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
@@ -276,7 +276,7 @@ These are invoked by the AI during a session — you normally don't run them by
276
276
  | `wade plan-session done <plan_dir>` | Finalize a planning session |
277
277
  | `wade deps-session check` | Verify the detached dependency-analysis runtime before writing output or staging a knowledge vote |
278
278
 
279
- Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `plan`, `implement`, and `review pr-comments` accept repeatable `--skill` and `--review-skill` methodology bindings plus `--refresh-skills` for an existing frozen session; `implement-batch` forwards the same binding request to every child session. Standalone plan/code/batch review and `task deps` accept repeatable `--skill`. `implement`, `implement-batch`, `review pr-comments`, and the `wade <N>` shorthand also accept `--network` / `--no-network` (see [Codex sandbox](#codex-sandbox--network-policy)); batch and shorthand forward an explicit flag to the child session they launch. `implement` additionally supports `--detach` (new terminal tab), `--cd` (print worktree path only), and `--base <branch>` (see [Planning & base branches](#planning--base-branches)).
279
+ Most workflow commands accept `--ai <tool>`, `--model <model>`, `--effort <level>`, `--permission-mode <tier>`, and `--yolo` to override configured defaults. `review pr-comments` additionally accepts `--effort none` to pin the tool default instead of a configured effort across a later wait/relaunch. `plan`, `implement`, and `review pr-comments` accept repeatable `--skill` and `--review-skill` methodology bindings plus `--refresh-skills` for an existing frozen session; `implement-batch` forwards the same binding request to every child session. Standalone plan/code/batch review and `task deps` accept repeatable `--skill`. `plan`, `implement`, `implement-batch`, standalone reviews (`review plan`, `review implementation`, `review batch`), `review pr-comments`, `task deps`, and the `wade <N>` shorthand also accept `--sandbox` / `--no-sandbox` (see [AI runtime sandbox profile](#ai-runtime-sandbox-profile)); batch and shorthand forward an explicit flag to the child session they launch. `implement` additionally supports `--detach` (new terminal tab), `--cd` (print worktree path only), and `--base <branch>` (see [Planning & base branches](#planning--base-branches)).
280
280
 
281
281
  ## Planning & base branches
282
282
 
@@ -348,7 +348,7 @@ for reviews"** after `wade implementation-session done` and comments land —
348
348
  resolves its tool, model, effort, and autonomy tier from a dedicated
349
349
  `ai.review_pr_comments` section (the same keys every `ai.<command>` section
350
350
  accepts: `tool`, `model`, `effort`, `mode`, `permission_mode` / `yolo`,
351
- `network_access`, `enabled`, `timeout`):
351
+ `sandbox`, `enabled`, `timeout`):
352
352
 
353
353
  ```yaml
354
354
  ai:
@@ -689,59 +689,185 @@ appends a clearly labeled stderr tail containing at most the final 20 non-empty
689
689
  lines and 4,000 characters; if stdout is empty, that diagnostic is shown as the
690
690
  failure feedback, and any truncation is labeled.
691
691
 
692
- ### Codex sandbox & network policy
693
-
694
- When WADE launches [Codex](https://github.com/openai/codex) in a linked
695
- worktree, Codex runs under `--sandbox workspace-write`, which confines writes to
696
- the worktree tree. A worktree's git metadata, however, lives **outside** that
697
- tree (`<main>/.git/worktrees/<wt>` and `<main>/.git`), so without extra grants
698
- every git write — `git add`/commit, ref updates, stash, and `wade
699
- sync`/`done` — fails with `Unable to create …/index.lock` or `could not write
700
- index`. WADE fixes this automatically: it passes the worktree's absolute path to
701
- the launcher, which grants those out-of-root git-metadata dirs as sandbox
702
- writable roots (the OS sandbox otherwise stays fully enabled — this widens
703
- nothing else). This is transparent; no Codex config or manual approval is
704
- needed, and it only affects Codex (every other tool ignores it).
705
-
706
- **Filesystem writes and network access are independent.** The metadata grant
707
- above makes **local** git work (stage, commit, stash, ref updates, and the
708
- local legs of `sync`/`done`) succeed with **network off**. Only operations that
709
- reach the network — `git fetch` (hence `sync`) and `git push` (hence the network
710
- leg of `done`) — need network access. It is **enabled by default** for the
711
- interactive lifecycle commands `wade implement` (including its batch children)
712
- and `wade review pr-comments`, because their readiness, sync, and completion
713
- steps require GitHub. Choose offline operation explicitly with `--no-network`,
714
- or in `.wade.yml`:
692
+ ### AI runtime sandbox profile
693
+
694
+ `ai.sandbox` is a single cross-tool boolean that decides whether WADE launches
695
+ the **AI runtime** inside its own filesystem sandbox. It governs the external
696
+ runtime boundary only — it never relaxes WADE's own guards (see below).
697
+
698
+ | Setting | Meaning |
699
+ |---------|---------|
700
+ | `sandbox: false` (**default**) | Launch the runtime unrestricted. Codex gets `--sandbox danger-full-access`, Cursor `--sandbox disabled`. Repository commands and delegated child tools keep **normal host access and credentials**. |
701
+ | `sandbox: true` | Launch the runtime confined. Codex gets `--sandbox workspace-write`, Cursor `--sandbox enabled`. |
702
+
703
+ Network access is **on in both profiles** and is no longer configurable — it is
704
+ enabled for every WADE launch. Not every phase needs it (planning and
705
+ dependency analysis deliberately do not), but the phases that do — `git
706
+ fetch`/`push`, `gh`, package installs — cannot work without it, and the profile
707
+ is fixed at launch.
708
+
709
+ Set it globally or per command, and override it on any launch command
710
+ (`implement`, `implement-batch`, `plan`, `review pr-comments`, `task deps`, `smart-start`,
711
+ and the `i`/`r`/`p` aliases) with `--sandbox` / `--no-sandbox`:
715
712
 
716
713
  ```yaml
717
714
  ai:
718
- network_access: false # offline opt-out for interactive session commands
715
+ sandbox: true # confine every session's runtime
719
716
  implement:
720
- network_access: true # per-command override wins
717
+ sandbox: false # ...except implementation (per-command wins)
721
718
  ```
722
719
 
723
- The policy applies to the **interactive session commands** — `wade implement`
724
- and `wade review pr-comments` — which are the ones that run `sync`/`done` and so
725
- may need `fetch`/`push`. The headless/analytical paths (`plan`, `deps`,
726
- `review plan`/`implementation`/`batch`) are **always** network-off by design:
727
- they never fetch or push, so `ai.network_access` does not apply to them and no
728
- flag enables it there. Precedence for the commands that honor it is
729
- `--network`/`--no-network` > `ai.<command>.network_access` >
730
- `ai.network_access` > **on for `implement` and `review_pr_comments`, otherwise
731
- off**. WADE always passes an explicit pin, so an ambient
732
- `network_access = true` in your own Codex `config.toml` can never silently
733
- enable network for a WADE-managed sandbox. Enabling network permits outbound
734
- access for commands inside the Codex workspace-write sandbox; it does not
735
- disable filesystem sandboxing or change approval-policy semantics.
736
-
737
- An accepted single-issue plan handoff starts implementation from a planning
738
- session that is always network-off. When both the planning tool and resolved
739
- implementation tool are Codex and the implementation policy resolves to enabled,
740
- WADE starts a fresh detached Codex context with network explicitly enabled;
741
- reusing the planner process would retain its immutable network-off sandbox. If
742
- WADE cannot open that detached context, the handoff fails rather than reporting
743
- an implementation session ready. Open a new host terminal and run the displayed
744
- `wade implement <issue> --network` command to continue with the required policy.
720
+ Precedence: `--sandbox`/`--no-sandbox` > `ai.<command>.sandbox` > `ai.sandbox` >
721
+ **unrestricted**. WADE pins the resolved profile explicitly in *both* directions,
722
+ so an ambient setting in your own Codex `config.toml` can never silently move the
723
+ boundary of a WADE-managed session. The resolved profile is printed at launch
724
+ next to the tool, model, effort, and permission mode, with its meaning spelled
725
+ out — the security posture is never left implicit.
726
+
727
+ > **Why unrestricted is the default.** WADE runs a deliberately multi-model
728
+ > workflow: a session delegates to reviewers and dependency analysers that
729
+ > authenticate separately. Every `wade` command is a child of the AI runtime, so
730
+ > a sandboxed outer runtime hands its sandbox to every child — and a separately
731
+ > authenticated reviewer such as Claude Code loses its normal host login. That is
732
+ > what makes delegated multi-model sessions fail in practice (#478).
733
+
734
+ **`unrestricted` is not "unattended".** The profile is orthogonal to
735
+ `permission_mode`: it moves the OS boundary, not the approval tier. Codex's
736
+ `--sandbox danger-full-access` is a distinct flag from
737
+ `--dangerously-bypass-approvals-and-sandbox`, so disabling the sandbox never
738
+ implies `yolo` and never changes the resolved autonomy tier. Treat it as an
739
+ intentional project opt-in to host access, not as a synonym for skipping prompts.
740
+
741
+ Only tools with a sandbox toggle (Codex, Cursor) act on the setting. The
742
+ capability handling is deliberately **asymmetric**, because the default is
743
+ `false`:
744
+
745
+ - `sandbox: false` on a tool that never sandboxed anything (Claude, Copilot, …)
746
+ is a silent no-op — those runtimes are already unrestricted.
747
+ - `sandbox: true` **explicitly requested** on a tool with no sandbox toggle is a
748
+ visible error naming the tool. WADE cannot impose a boundary the runtime does
749
+ not have, and will not pretend it did. No tool ever receives an invented flag.
750
+
751
+ #### Worktree git metadata under `sandbox: true`
752
+
753
+ A worktree's git metadata lives **outside** the worktree tree
754
+ (`<main>/.git/worktrees/<wt>` and `<main>/.git`), so under `workspace-write`
755
+ every git write — `git add`/commit, ref updates, stash, and `wade sync`/`done` —
756
+ would fail with `Unable to create …/index.lock` or `could not write index`. WADE
757
+ fixes this automatically: it passes the worktree's absolute path to the launcher,
758
+ which grants those out-of-root git-metadata dirs as sandbox writable roots (the
759
+ OS sandbox otherwise stays fully enabled — this widens nothing else). It is
760
+ transparent, needs no Codex config or manual approval, and is inert under
761
+ `sandbox: false`, where there is no boundary to widen.
762
+
763
+ #### WADE's own guards are unaffected
764
+
765
+ Disabling the runtime sandbox does not disable WADE's containment. The
766
+ worktree-containment guard actually gets **wider**: under `sandbox: true` it is
767
+ narrowed to the shell token (Codex's sandbox already covers tool-call writes, but
768
+ permits `/tmp` and `$TMPDIR`, so a shell redirect can still escape), while under
769
+ `sandbox: false` the **full** matcher is installed because nothing else covers
770
+ tool-call writes outside the worktree. The plan-artifact guard, lifecycle hooks,
771
+ the Stop hook, and the pre-push backstop are identical in both profiles.
772
+
773
+ #### Plan → implement handoff
774
+
775
+ The sandbox is a launch-time OS property: a process started confined cannot drop
776
+ its sandbox later. An accepted plan handoff runs after the planner child exits,
777
+ so WADE assesses the **actual parent runtime enclosing the handoff**, not the
778
+ former planner's requested profile. When that runtime is detected as sandboxed
779
+ and implementation resolves to **unrestricted**, WADE fails the handoff rather
780
+ than claiming a terminal child escaped the parent boundary. It names the runtime
781
+ it could not escape, and you open a new host terminal and run the displayed
782
+ `wade implement <issue> --no-sandbox` command. Without a published sandbox
783
+ signal, the ordinary nested-launch guard applies rather than guessing.
784
+
785
+ #### An inner `wade` process cannot escape a parent sandbox
786
+
787
+ Every `wade` command you run from inside an AI CLI session is a **child** of that
788
+ session. If the session was launched under an OS sandbox, every descendant
789
+ inherits the boundary — no profile WADE resolves, and no flag it passes to a
790
+ delegated runtime, can widen it. WADE will never claim otherwise, and there is no
791
+ setting that changes it. **The fix is always to relaunch the outer session with
792
+ the profile you want**, from a host terminal.
793
+
794
+ What WADE does instead is say so. When the resolved profile is unrestricted and
795
+ the enclosing runtime is *known* to be sandboxed, it names that runtime when it
796
+ can (or says **the enclosing AI runtime** when an identity marker is absent) and
797
+ prints the exact command to re-run — on implementation, plan,
798
+ PR-comment review, and every delegated operation (dependency analysis, plan/code
799
+ review, batch review), plus batch implementation before it dispatches terminal
800
+ brokers. That command preserves the resolved tool, model, effort,
801
+ and permission mode; only the sandbox profile changes to `--no-sandbox`.
802
+ Implementation and PR-comment retries reuse their frozen method bindings rather
803
+ than repeating `--skill` / `--review-skill` flags, while fresh delegated
804
+ operations carry their requested bindings. It warns and proceeds rather than
805
+ blocking: a delegated tool whose credentials happen to be reachable from inside
806
+ the sandbox may still
807
+ succeed, so refusing to try would break sessions that work today.
808
+
809
+ Detection is deliberately **best-effort and conservative**. WADE reads only
810
+ sandbox signals a runtime actually publishes and never infers confinement from
811
+ tool identity — a tool that *can* be sandboxed is not a tool that *is* sandboxed.
812
+ Today Codex publishes `CODEX_SANDBOX` for macOS Seatbelt, but its Linux Landlock
813
+ sandbox with network enabled publishes neither that marker nor a usable
814
+ `CODEX_SANDBOX_NETWORK_DISABLED` marker. WADE must report that Linux environment
815
+ as *unknown*, not unrestricted; if the distinction matters, relaunch from a host
816
+ terminal rather than expecting a diagnostic. When there is no signal WADE stays
817
+ silent rather than asserting a cause it cannot support. A confident wrong
818
+ diagnosis is worse than the opaque error it would replace. Managed Codex sessions
819
+ are still recognised when they expose session/thread markers instead of the
820
+ legacy `CODEX_CLI` marker; their displayed identity remains **Codex CLI**.
821
+
822
+ An explicit unrestricted signal (for example, Codex's
823
+ `CODEX_SANDBOX=danger-full-access`) is different from an absent signal: WADE
824
+ does **not** recommend relaunching the outer session for a permission- or
825
+ network-shaped launch failure in that case. The parent has already confirmed it
826
+ is unrestricted, so check executable permissions and network configuration
827
+ instead.
828
+
829
+ **Troubleshooting order** when a delegated tool fails to launch:
830
+
831
+ 1. **Read what WADE printed.** An explicit sandbox-policy denial plus a named
832
+ runtime and command means relaunch the outer session with that command. A
833
+ generic permission or network denial also needs local checks below.
834
+ 2. **Check whether the reviewer actually started.** A reviewer that ran and
835
+ exited non-zero is a different problem; "relaunch the outer session" is wrong
836
+ advice for it. WADE distinguishes the two. A generic launch denial can also
837
+ be bad executable permissions or network configuration; a refusal WADE made
838
+ itself (an unknown tool, a tool with no headless mode) never reached the
839
+ sandbox and gets generic remediation instead.
840
+ 3. **Check executable permissions, network, and the tool's own login/PATH** in the runtime where it must run
841
+ (`gh auth status`, the delegate's own auth command). A separately
842
+ authenticated delegate needs its *own* credentials, not WADE's.
843
+ 4. **Re-run the phase readiness check** (`wade implementation-session check`,
844
+ `wade review-pr-comments-session check`, …) for a narrow `reason=…` and its
845
+ least-privilege remediation.
846
+ 5. **Only then** widen the profile — and widen the *outer* session, not the
847
+ child.
848
+
849
+ > **Narrow, optional exception: Codex project prefix rules.** Codex can be
850
+ > configured to run specific command prefixes outside its sandbox, which elevates
851
+ > a single command without relaunching the session. It is a Codex-side setting
852
+ > WADE neither writes nor reads, it applies per command rather than to the
853
+ > session, and it does not change anything above: the session is still sandboxed
854
+ > and every other child still inherits that. Treat it as an escape hatch for one
855
+ > stubborn command, **not** as WADE's path for running unrestricted — that path
856
+ > is relaunching the outer session.
857
+
858
+ #### Migrating from `ai.network_access`
859
+
860
+ `ai.network_access` was a Codex-only network pin, enabled by default for
861
+ `implement` and `review_pr_comments` and off everywhere else. It is **retired**.
862
+ An existing `.wade.yml` that still carries it keeps loading and passes
863
+ `wade check` with a **warning, not an error**; the key is ignored, and `wade
864
+ update` strips it — that is the only command that runs the config migration
865
+ pipeline. Replace it with `ai.sandbox` if you want the old confinement back:
866
+
867
+ ```yaml
868
+ ai:
869
+ sandbox: true # restores the pre-#478 Codex behaviour
870
+ ```
745
871
 
746
872
  ### Session readiness and least-privilege remediation
747
873
 
@@ -801,10 +927,27 @@ credentials, PATH, or sandbox execution access, it does not consume a
801
927
  timeout still counts as a bounded review attempt, so the review/fix loop cannot
802
928
  run forever.
803
929
 
804
- For Codex, keep `--sandbox workspace-write`; WADE/crossby add only the linked
805
- worktree's private/common Git metadata directories. Implementation and PR-comment
806
- sessions have network access by default for their GitHub lifecycle; use
807
- `--no-network` or `ai.network_access: false` when an offline sandbox is required.
930
+ A reviewer that **never started** — including a sandbox-capability refusal before
931
+ the launch — is recorded as an *unattempted* review so the state is auditable,
932
+ and that record is deliberately inert: it satisfies no review
933
+ requirement, spends no review pass, cannot overwrite a real receipt already
934
+ written for the same commit, and leaves `wade implementation-session done` and
935
+ `wade review-pr-comments-session done` closed. An infrastructure failure must
936
+ never be able to certify a commit. A reviewer that started and exited non-zero
937
+ stays distinguishable from one that never ran, because the two need opposite
938
+ remediation.
939
+
940
+ For Codex, WADE launches unsandboxed by default so delegated tools keep their
941
+ own host credentials; set `ai.sandbox: true` (or pass `--sandbox`) to keep
942
+ `--sandbox workspace-write`, where WADE/crossby add only the linked worktree's
943
+ private/common Git metadata directories. Every session has network access in
944
+ both profiles for its GitHub lifecycle.
945
+ Standalone `wade review plan`, `wade review implementation`, and `wade review
946
+ batch` runs also accept `--sandbox` / `--no-sandbox`; an inherited-sandbox
947
+ diagnosis gives the host-terminal relaunch command with `--no-sandbox` so it
948
+ overrides an `ai.sandbox: true` configuration. The command also preserves the
949
+ selected review mode, tool, model, effort, permission mode, staged scope, and
950
+ review-skill overrides so the retry reviews the same operation.
808
951
  For Claude Code and Cursor, allowlist the worktree/Git metadata paths and only
809
952
  the GitHub domains needed by the session rather than choosing unrestricted shell
810
953
  access. Copilot and VS Code need network plus usable `gh` credentials in their