gitwise-cli 0.35.0__tar.gz → 0.36.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 (209) hide show
  1. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/CHANGELOG.md +12 -0
  2. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/PKG-INFO +1 -1
  3. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/__init__.py +1 -1
  4. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_cli_dispatch.py +0 -1
  5. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_cli_parser.py +2 -3
  6. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_i18n_data.json +6 -6
  7. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/clean.py +0 -6
  8. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/snapshot.py +8 -1
  9. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/update.py +32 -6
  10. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/pyproject.toml +1 -1
  11. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/claude/rules/gitwise.md +1 -1
  12. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/codex/agents/gitwise.toml.template +1 -1
  13. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/continue/rules/gitwise.md.template +1 -1
  14. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/cursor/rules/gitwise.mdc.template +1 -1
  15. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/opencode/agents/gitwise.md.template +1 -1
  16. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/pi/skills/gitwise.md.template +1 -1
  17. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/clean.json +0 -4
  18. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_clean.py +19 -20
  19. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_snapshot.py +13 -0
  20. gitwise_cli-0.36.0/tests/test_update.py +65 -0
  21. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/.gitignore +0 -0
  22. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/LICENSE +0 -0
  23. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/README.md +0 -0
  24. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/bin/gitwise +0 -0
  25. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/bin/gw +0 -0
  26. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/__main__.py +0 -0
  27. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_cli_completions.py +0 -0
  28. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_cli_introspection.py +0 -0
  29. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_cli_setup_agents.py +0 -0
  30. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_paths.py +0 -0
  31. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/_runtime_config.py +0 -0
  32. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/audit.py +0 -0
  33. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/branches.py +0 -0
  34. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/commit.py +0 -0
  35. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/conflicts.py +0 -0
  36. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/context.py +0 -0
  37. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/design.py +0 -0
  38. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/diff.py +0 -0
  39. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/doctor.py +0 -0
  40. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/git.py +0 -0
  41. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/health.py +0 -0
  42. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/i18n.py +0 -0
  43. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/log.py +0 -0
  44. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/merge.py +0 -0
  45. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/optimize.py +0 -0
  46. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/output.py +0 -0
  47. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/pick.py +0 -0
  48. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/pr.py +0 -0
  49. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/py.typed +0 -0
  50. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/schema.py +0 -0
  51. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup.py +0 -0
  52. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/__init__.py +0 -0
  53. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/__init__.py +0 -0
  54. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/aider.py +0 -0
  55. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/base.py +0 -0
  56. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/codex.py +0 -0
  57. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/continue_adapter.py +0 -0
  58. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/cursor.py +0 -0
  59. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/opencode.py +0 -0
  60. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/adapters/pi.py +0 -0
  61. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/exec.py +0 -0
  62. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/format.py +0 -0
  63. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/plan.py +0 -0
  64. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/plan_gitfiles.py +0 -0
  65. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/plan_skills.py +0 -0
  66. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/__init__.py +0 -0
  67. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/aider.py +0 -0
  68. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/base.py +0 -0
  69. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/claude.py +0 -0
  70. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/codex.py +0 -0
  71. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/continue_adapter.py +0 -0
  72. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/cursor.py +0 -0
  73. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/opencode.py +0 -0
  74. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/providers/pi.py +0 -0
  75. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/state.py +0 -0
  76. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/setup_agents/types.py +0 -0
  77. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/show.py +0 -0
  78. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/stash.py +0 -0
  79. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/status.py +0 -0
  80. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/suggest.py +0 -0
  81. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/summarize.py +0 -0
  82. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/sync.py +0 -0
  83. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/tag.py +0 -0
  84. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/undo.py +0 -0
  85. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/__init__.py +0 -0
  86. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/git_output.py +0 -0
  87. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/in_progress.py +0 -0
  88. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/json_envelope.py +0 -0
  89. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/parsing.py +0 -0
  90. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/secret_scan.py +0 -0
  91. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/utils/types.py +0 -0
  92. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/gitwise/worktree.py +0 -0
  93. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/install.sh +0 -0
  94. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/agents/skills/git-audit/SKILL.md +0 -0
  95. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/agents/skills/git-clean/SKILL.md +0 -0
  96. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/agents/skills/git-optimize/SKILL.md +0 -0
  97. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/aider/CONVENTIONS.md.template +0 -0
  98. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/aider/aider.conf.yml.template +0 -0
  99. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/claude/CLAUDE.md.template +0 -0
  100. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/claude/settings.json.template +0 -0
  101. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/claude/skills/git-audit/SKILL.md +0 -0
  102. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/claude/skills/git-clean/SKILL.md +0 -0
  103. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/claude/skills/git-optimize/SKILL.md +0 -0
  104. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/git-config-modern.txt +0 -0
  105. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/hooks/commit-msg +0 -0
  106. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/hooks/pre-commit +0 -0
  107. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/audit.json +0 -0
  108. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/branches.json +0 -0
  109. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/commands.json +0 -0
  110. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/commit.json +0 -0
  111. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/completions.json +0 -0
  112. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/conflicts.json +0 -0
  113. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/context.json +0 -0
  114. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/diff.json +0 -0
  115. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/doctor.json +0 -0
  116. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/health.json +0 -0
  117. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/log.json +0 -0
  118. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/merge.json +0 -0
  119. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/optimize.json +0 -0
  120. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/pick.json +0 -0
  121. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/pr.json +0 -0
  122. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/schema.json +0 -0
  123. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/setup-agents.json +0 -0
  124. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/setup.json +0 -0
  125. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/show.json +0 -0
  126. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/snapshot.json +0 -0
  127. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/stash.json +0 -0
  128. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/status.json +0 -0
  129. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/suggest.json +0 -0
  130. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/summarize.json +0 -0
  131. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/sync.json +0 -0
  132. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/tag.json +0 -0
  133. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/undo.json +0 -0
  134. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/update.json +0 -0
  135. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/input/worktree.json +0 -0
  136. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/audit.json +0 -0
  137. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/branches.json +0 -0
  138. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/clean.json +0 -0
  139. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/commands.json +0 -0
  140. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/commit.json +0 -0
  141. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/conflicts.json +0 -0
  142. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/context.json +0 -0
  143. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/diff.json +0 -0
  144. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/doctor.json +0 -0
  145. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/health.json +0 -0
  146. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/log.json +0 -0
  147. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/merge.json +0 -0
  148. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/optimize.json +0 -0
  149. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/pick.json +0 -0
  150. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/pr.json +0 -0
  151. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/setup-agents.json +0 -0
  152. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/setup.json +0 -0
  153. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/snapshot.json +0 -0
  154. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/stash.json +0 -0
  155. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/status.json +0 -0
  156. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/suggest.json +0 -0
  157. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/summarize.json +0 -0
  158. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/sync.json +0 -0
  159. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/tag.json +0 -0
  160. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/undo.json +0 -0
  161. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/update.json +0 -0
  162. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/share/schemas/v1/output/worktree.json +0 -0
  163. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/__init__.py +0 -0
  164. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/conftest.py +0 -0
  165. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_adapters.py +0 -0
  166. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_audit.py +0 -0
  167. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_branches.py +0 -0
  168. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_commands.py +0 -0
  169. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_commit.py +0 -0
  170. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_conflicts.py +0 -0
  171. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_context.py +0 -0
  172. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_design.py +0 -0
  173. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_diff.py +0 -0
  174. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_doctor.py +0 -0
  175. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_edge_cases.py +0 -0
  176. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_envelope_contract.py +0 -0
  177. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_git.py +0 -0
  178. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_git_output_utils.py +0 -0
  179. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_health.py +0 -0
  180. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_i18n.py +0 -0
  181. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_in_progress.py +0 -0
  182. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_json_envelope_utils.py +0 -0
  183. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_log.py +0 -0
  184. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_main.py +0 -0
  185. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_md_links_script.py +0 -0
  186. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_merge.py +0 -0
  187. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_optimize.py +0 -0
  188. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_output.py +0 -0
  189. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_parsing_utils.py +0 -0
  190. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_pick.py +0 -0
  191. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_pr.py +0 -0
  192. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_roadmap_baseline_script.py +0 -0
  193. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_sa_plan.py +0 -0
  194. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_sa_unit.py +0 -0
  195. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_schema_catalog.py +0 -0
  196. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_secret_scan.py +0 -0
  197. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_setup.py +0 -0
  198. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_setup_agents.py +0 -0
  199. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_show.py +0 -0
  200. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_stash.py +0 -0
  201. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_status.py +0 -0
  202. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_suggest.py +0 -0
  203. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_summarize.py +0 -0
  204. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_sync.py +0 -0
  205. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_sync_changelog_es_script.py +0 -0
  206. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_tag.py +0 -0
  207. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_types.py +0 -0
  208. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_undo.py +0 -0
  209. {gitwise_cli-0.35.0 → gitwise_cli-0.36.0}/tests/test_worktree.py +0 -0
@@ -3,6 +3,18 @@
3
3
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
4
4
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
5
 
6
+ ## v0.36.0 (2026-07-22)
7
+
8
+ ### Fix
9
+
10
+ - remove unimplemented clean refs contract
11
+
12
+ ## v0.35.1 (2026-07-22)
13
+
14
+ ### Fix
15
+
16
+ - **snapshot**: honor canonical agents layout
17
+
6
18
  ## v0.35.0 (2026-07-22)
7
19
 
8
20
  ### Feat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitwise-cli
3
- Version: 0.35.0
3
+ Version: 0.36.0
4
4
  Summary: Python CLI for optimizing git workflows and Claude Code integration
5
5
  Project-URL: Homepage, https://github.com/drzioner/gitwise
6
6
  Project-URL: Repository, https://github.com/drzioner/gitwise
@@ -1,6 +1,6 @@
1
1
  """gitwise -- CLI for optimizing git workflows and coding-agent integration."""
2
2
 
3
- __version__ = "0.35.0"
3
+ __version__ = "0.36.0"
4
4
 
5
5
 
6
6
  def get_version() -> str:
@@ -125,7 +125,6 @@ def _run_clean(args: argparse.Namespace) -> int:
125
125
 
126
126
  return run_clean(
127
127
  branches=args.branches,
128
- refs=args.refs,
129
128
  dry_run=args.dry_run,
130
129
  yes=args.yes,
131
130
  as_json=args.json,
@@ -157,16 +157,15 @@ def build_parser() -> argparse.ArgumentParser:
157
157
  p.add_argument("--diff", action="store_true")
158
158
  p.add_argument("--max-commits", type=int, default=10, dest="max_commits")
159
159
 
160
- p = sub.add_parser("snapshot", help="generate .claude/git-snapshot.md", parents=[parent])
160
+ p = sub.add_parser("snapshot", help="generate agent git snapshot", parents=[parent])
161
161
 
162
162
  p = sub.add_parser(
163
163
  "clean",
164
- help="clean up stale branches and refs",
164
+ help="clean up stale branches",
165
165
  aliases=["branch-clean"],
166
166
  parents=[parent],
167
167
  )
168
168
  p.add_argument("--branches", action="store_true")
169
- p.add_argument("--refs", action="store_true")
170
169
  p.add_argument("--dry-run", action="store_true")
171
170
  p.add_argument("--yes", "-y", action="store_true")
172
171
 
@@ -151,13 +151,9 @@
151
151
  "es": "gitwise clean --branches --dry-run",
152
152
  "en": "gitwise clean --branches --dry-run"
153
153
  },
154
- "clean_refs_not_implemented": {
155
- "es": "'clean --refs' no está implementado",
156
- "en": "'clean --refs' is not implemented"
157
- },
158
154
  "clean_specify_flag": {
159
- "es": "especifica --branches (o --refs)",
160
- "en": "specify --branches (or --refs)"
155
+ "es": "especifica --branches",
156
+ "en": "specify --branches"
161
157
  },
162
158
  "clean_to_delete": {
163
159
  "es": "para eliminar: gitwise clean --branches --yes",
@@ -2071,6 +2067,10 @@
2071
2067
  "es": "ejecutaría: git pull --ff-only en {dir}",
2072
2068
  "en": "would run: git pull --ff-only in {dir}"
2073
2069
  },
2070
+ "update_deprecation_hint": {
2071
+ "es": "update esta deprecado; usa `brew upgrade gitwise` para Homebrew o `uv tool upgrade gitwise-cli` para instalaciones con uv tool",
2072
+ "en": "update is deprecated; use `brew upgrade gitwise` for Homebrew or `uv tool upgrade gitwise-cli` for uv tool installations"
2073
+ },
2074
2074
  "updated_git_conventions": {
2075
2075
  "es": "actualizado: {file} (convenciones git agregadas)",
2076
2076
  "en": "updated: {file} (git conventions added)"
@@ -59,7 +59,6 @@ def _categorize(
59
59
  def run_clean(
60
60
  *,
61
61
  branches: bool = False,
62
- refs: bool = False,
63
62
  dry_run: bool = False,
64
63
  yes: bool = False,
65
64
  as_json: bool = False,
@@ -70,11 +69,6 @@ def run_clean(
70
69
  user-cancelled), 1 on delete failures or missing flag, 2 when
71
70
  ``--json`` is used without ``--yes``.
72
71
  """
73
- if refs:
74
- return report_error(
75
- "clean", as_json=as_json, msg=t("clean_refs_not_implemented"), code="not_implemented"
76
- )
77
-
78
72
  if not branches:
79
73
  return report_error(
80
74
  "clean", as_json=as_json, msg=t("clean_specify_flag"), code="clean_specify_flag"
@@ -10,6 +10,13 @@ from gitwise.output import debug, print_header, print_json, status
10
10
  from gitwise.utils.json_envelope import ok_envelope
11
11
 
12
12
 
13
+ def _snapshot_relative_path(root: Path) -> str:
14
+ """Return the snapshot path for the repository's active agent layout."""
15
+ if (root / ".agents").is_dir():
16
+ return ".agents/git-snapshot.md"
17
+ return ".claude/git-snapshot.md"
18
+
19
+
13
20
  def _append_branch_section(lines: list[str], *, root: Path) -> None:
14
21
  """Append the current branch section to *lines*."""
15
22
  branch = git_run(["branch", "--show-current"], cwd=root, check=False)
@@ -105,7 +112,7 @@ def run_snapshot(*, as_json: bool = False) -> int:
105
112
  return 1
106
113
 
107
114
  with status(t("status_snapshot_gen")):
108
- path = generate_snapshot(root)
115
+ path = generate_snapshot(root, relative_path=_snapshot_relative_path(root))
109
116
 
110
117
  if as_json:
111
118
  print_json(ok_envelope("snapshot", path=str(path)))
@@ -5,13 +5,16 @@ from pathlib import Path
5
5
  from gitwise.git import current_branch, has_upstream
6
6
  from gitwise.git import run as git_run
7
7
  from gitwise.i18n import t
8
- from gitwise.output import error, info, print_dim, print_header, print_json, status
8
+ from gitwise.output import error, info, print_dim, print_header, print_json, status, warn
9
9
  from gitwise.utils.json_envelope import error_envelope, ok_envelope
10
10
 
11
11
 
12
12
  def run_update(*, dry_run: bool = False, as_json: bool = False) -> int:
13
13
  """Entry point for the ``gitwise update`` command. Pulls the gitwise repo via git."""
14
14
  install_dir = Path(__file__).parent.parent
15
+ upgrade_hint = t("update_deprecation_hint")
16
+ if not as_json:
17
+ warn(upgrade_hint)
15
18
  if not (install_dir / ".git").is_dir():
16
19
  if as_json:
17
20
  print_json(
@@ -19,6 +22,7 @@ def run_update(*, dry_run: bool = False, as_json: bool = False) -> int:
19
22
  "update",
20
23
  error=t("update_requires_git_clone"),
21
24
  code="update_requires_git_clone",
25
+ hint=upgrade_hint,
22
26
  )
23
27
  )
24
28
  else:
@@ -26,7 +30,9 @@ def run_update(*, dry_run: bool = False, as_json: bool = False) -> int:
26
30
  return 1
27
31
  if dry_run:
28
32
  if as_json:
29
- print_json(ok_envelope("update", dry_run=True, dir=str(install_dir)))
33
+ print_json(
34
+ ok_envelope("update", dry_run=True, dir=str(install_dir), hints=[upgrade_hint])
35
+ )
30
36
  return 0
31
37
  print_dim(t("update_dry_run", dir=str(install_dir)))
32
38
  return 0
@@ -35,7 +41,15 @@ def run_update(*, dry_run: bool = False, as_json: bool = False) -> int:
35
41
  msg = t("update_no_upstream", branch=branch)
36
42
  hint = t("update_no_upstream_hint", branch=branch)
37
43
  if as_json:
38
- print_json(error_envelope("update", error=msg, code="no_upstream", hint=hint))
44
+ print_json(
45
+ error_envelope(
46
+ "update",
47
+ error=msg,
48
+ code="no_upstream",
49
+ hint=hint,
50
+ hints=[upgrade_hint],
51
+ )
52
+ )
39
53
  else:
40
54
  error(msg, hint=hint)
41
55
  return 1
@@ -45,7 +59,9 @@ def run_update(*, dry_run: bool = False, as_json: bool = False) -> int:
45
59
  r = git_run(["pull", "--ff-only"], cwd=install_dir, check=False)
46
60
  if r.returncode == 0 and r.stdout.strip() and r.stdout.strip() != "Already up to date.":
47
61
  if as_json:
48
- print_json(ok_envelope("update", updated=True, output=r.stdout.strip()))
62
+ print_json(
63
+ ok_envelope("update", updated=True, output=r.stdout.strip(), hints=[upgrade_hint])
64
+ )
49
65
  return 0
50
66
  for line in r.stdout.strip().splitlines():
51
67
  info(line)
@@ -53,13 +69,23 @@ def run_update(*, dry_run: bool = False, as_json: bool = False) -> int:
53
69
  if as_json:
54
70
  print_json(
55
71
  error_envelope(
56
- "update", error=r.stderr.strip() or t("error_updating"), code="update_failed"
72
+ "update",
73
+ error=r.stderr.strip() or t("error_updating"),
74
+ code="update_failed",
75
+ hint=upgrade_hint,
57
76
  )
58
77
  )
59
78
  return 1
60
79
  error(r.stderr.strip() or t("error_updating"))
61
80
  return 1
62
81
  elif as_json:
63
- print_json(ok_envelope("update", updated=False, output=t("already_up_to_date")))
82
+ print_json(
83
+ ok_envelope(
84
+ "update",
85
+ updated=False,
86
+ output=t("already_up_to_date"),
87
+ hints=[upgrade_hint],
88
+ )
89
+ )
64
90
  return 0
65
91
  return 0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "gitwise-cli"
3
- version = "0.35.0"
3
+ version = "0.36.0"
4
4
  description = "Python CLI for optimizing git workflows and Claude Code integration"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -9,7 +9,7 @@ globs: "**/*"
9
9
  - Changed files: `gitwise diff` — never raw `git diff`
10
10
  - Status + log: `gitwise summarize` — never raw `git status` or `git log`
11
11
  - Branch switch: `gitwise worktree new <branch>` — never `git stash + checkout`
12
- - Snapshot: `gitwise snapshot` regenerates `.claude/git-snapshot.md`
12
+ - Snapshot: `gitwise snapshot`; writes `.agents/git-snapshot.md` when `.agents/` exists, otherwise `.claude/git-snapshot.md`
13
13
 
14
14
  ## Shell note
15
15
 
@@ -10,7 +10,7 @@ developer_instructions = """
10
10
  - Changed files: `gitwise diff` — never raw `git diff`
11
11
  - Status + log: `gitwise summarize` — never raw `git status` or `git log`
12
12
  - Branch switch: `gitwise worktree new <branch>` — never `git stash + checkout`
13
- - Snapshot: `gitwise snapshot` regenerates `.claude/git-snapshot.md`
13
+ - Snapshot: `gitwise snapshot`; writes `.agents/git-snapshot.md` when `.agents/` exists, otherwise `.claude/git-snapshot.md`
14
14
 
15
15
  ## Shell note
16
16
 
@@ -8,7 +8,7 @@ description: Use gitwise CLI for git operations — gitwise diff, summarize, wor
8
8
  - Changed files: `gitwise diff` — never raw `git diff`
9
9
  - Status + log: `gitwise summarize` — never raw `git status` or `git log`
10
10
  - Branch switch: `gitwise worktree new <branch>` — never `git stash + checkout`
11
- - Snapshot: `gitwise snapshot` regenerates `.claude/git-snapshot.md`
11
+ - Snapshot: `gitwise snapshot`; writes `.agents/git-snapshot.md` when `.agents/` exists, otherwise `.claude/git-snapshot.md`
12
12
  - Audit: `gitwise audit --quick` — before large commits
13
13
  - Clean: `gitwise clean --branches` — remove stale branches
14
14
  - Optimize: `gitwise optimize` — gc, pack-refs, commit-graph
@@ -10,7 +10,7 @@ alwaysApply: true
10
10
  - Changed files: `gitwise diff` — never raw `git diff`
11
11
  - Status + log: `gitwise summarize` — never raw `git status` or `git log`
12
12
  - Branch switch: `gitwise worktree new <branch>` — never `git stash + checkout`
13
- - Snapshot: `gitwise snapshot` regenerates `.claude/git-snapshot.md`
13
+ - Snapshot: `gitwise snapshot`; writes `.agents/git-snapshot.md` when `.agents/` exists, otherwise `.claude/git-snapshot.md`
14
14
  - Audit: `gitwise audit --quick` — before large commits
15
15
  - Clean: `gitwise clean --branches` — remove stale branches
16
16
  - Optimize: `gitwise optimize` — gc, pack-refs, commit-graph
@@ -8,7 +8,7 @@ description: Use gitwise CLI for git operations — gitwise diff, summarize, wor
8
8
  - Changed files: `gitwise diff` — never raw `git diff`
9
9
  - Status + log: `gitwise summarize` — never raw `git status` or `git log`
10
10
  - Branch switch: `gitwise worktree new <branch>` — never `git stash + checkout`
11
- - Snapshot: `gitwise snapshot` regenerates `.claude/git-snapshot.md`
11
+ - Snapshot: `gitwise snapshot`; writes `.agents/git-snapshot.md` when `.agents/` exists, otherwise `.claude/git-snapshot.md`
12
12
  - Audit: `gitwise audit --quick` — before large commits
13
13
  - Clean: `gitwise clean --branches` — remove stale branches
14
14
  - Optimize: `gitwise optimize` — gc, pack-refs, commit-graph
@@ -8,7 +8,7 @@ description: Use gitwise CLI for git operations — gitwise diff, summarize, wor
8
8
  - Changed files: `gitwise diff` — never raw `git diff`
9
9
  - Status + log: `gitwise summarize` — never raw `git status` or `git log`
10
10
  - Branch switch: `gitwise worktree new <branch>` — never `git stash + checkout`
11
- - Snapshot: `gitwise snapshot` regenerates `.claude/git-snapshot.md`
11
+ - Snapshot: `gitwise snapshot`; writes `.agents/git-snapshot.md` when `.agents/` exists, otherwise `.claude/git-snapshot.md`
12
12
  - Audit: `gitwise audit --quick` — before large commits
13
13
  - Clean: `gitwise clean --branches` — remove stale branches
14
14
  - Optimize: `gitwise optimize` — gc, pack-refs, commit-graph
@@ -36,10 +36,6 @@
36
36
  "type": "boolean",
37
37
  "default": false
38
38
  },
39
- "refs": {
40
- "type": "boolean",
41
- "default": false
42
- },
43
39
  "dry_run": {
44
40
  "type": "boolean",
45
41
  "default": false
@@ -8,6 +8,8 @@ import pytest
8
8
  from gitwise.clean import run_clean
9
9
  from gitwise.git import stale_branches
10
10
 
11
+ from conftest import run_gitwise
12
+
11
13
 
12
14
  def test_dry_run_does_not_delete(
13
15
  monkeypatch: pytest.MonkeyPatch, tmp_git_repo_with_stale: Path
@@ -16,7 +18,7 @@ def test_dry_run_does_not_delete(
16
18
  before = stale_branches(tmp_git_repo_with_stale)
17
19
  assert len(before) == 3
18
20
 
19
- rc = run_clean(branches=True, refs=False, dry_run=True, yes=True, as_json=False)
21
+ rc = run_clean(branches=True, dry_run=True, yes=True, as_json=False)
20
22
  assert rc == 0
21
23
 
22
24
  assert stale_branches(tmp_git_repo_with_stale) == before
@@ -28,7 +30,7 @@ def test_dry_run_lists_stale_branches(
28
30
  capsys: pytest.CaptureFixture,
29
31
  ) -> None:
30
32
  monkeypatch.chdir(tmp_git_repo_with_stale)
31
- run_clean(branches=True, refs=False, dry_run=True, yes=True, as_json=False)
33
+ run_clean(branches=True, dry_run=True, yes=True, as_json=False)
32
34
  captured = capsys.readouterr()
33
35
  output = captured.out + captured.err
34
36
  for i in range(1, 4):
@@ -41,7 +43,7 @@ def test_apply_deletes_only_stale(
41
43
  monkeypatch.chdir(tmp_git_repo_with_stale)
42
44
  assert len(stale_branches(tmp_git_repo_with_stale)) == 3
43
45
 
44
- rc = run_clean(branches=True, refs=False, dry_run=False, yes=True, as_json=False)
46
+ rc = run_clean(branches=True, dry_run=False, yes=True, as_json=False)
45
47
  assert rc == 0
46
48
 
47
49
  assert stale_branches(tmp_git_repo_with_stale) == []
@@ -157,7 +159,7 @@ def test_protected_branch_not_deleted(monkeypatch: pytest.MonkeyPatch, tmp_path:
157
159
 
158
160
  assert "develop" in stale_branches(local)
159
161
 
160
- rc = run_clean(branches=True, refs=False, dry_run=False, yes=True, as_json=False)
162
+ rc = run_clean(branches=True, dry_run=False, yes=True, as_json=False)
161
163
  assert rc == 0
162
164
 
163
165
  r = subprocess.run(
@@ -174,7 +176,7 @@ def test_json_output_structure(
174
176
  """as_json=True outputs parseable JSON with deletable/skipped keys."""
175
177
  monkeypatch.chdir(tmp_git_repo_with_stale)
176
178
 
177
- rc = run_clean(branches=True, refs=False, dry_run=True, yes=True, as_json=True)
179
+ rc = run_clean(branches=True, dry_run=True, yes=True, as_json=True)
178
180
  assert rc == 0
179
181
 
180
182
  captured = capsys.readouterr()
@@ -194,7 +196,7 @@ def test_clean_json_executes_delete(
194
196
  """Regression for Issue #45: --json without --dry-run must actually delete stale branches."""
195
197
  monkeypatch.chdir(tmp_git_repo_with_stale)
196
198
 
197
- rc = run_clean(branches=True, refs=False, dry_run=False, yes=True, as_json=True)
199
+ rc = run_clean(branches=True, dry_run=False, yes=True, as_json=True)
198
200
  assert rc == 0
199
201
 
200
202
  data = json.loads(capsys.readouterr().out)
@@ -220,7 +222,7 @@ def test_clean_json_requires_yes(
220
222
  ) -> None:
221
223
  """Q1: clean --json without --yes must return yes_required envelope."""
222
224
  monkeypatch.chdir(tmp_git_repo_with_stale)
223
- rc = run_clean(branches=True, refs=False, dry_run=False, yes=False, as_json=True)
225
+ rc = run_clean(branches=True, dry_run=False, yes=False, as_json=True)
224
226
  assert rc == 2
225
227
  data = json.loads(capsys.readouterr().out)
226
228
  assert data["ok"] is False
@@ -246,7 +248,7 @@ def test_active_worktree_protected(
246
248
  monkeypatch.chdir(repo)
247
249
 
248
250
  try:
249
- rc = run_clean(branches=True, refs=False, dry_run=False, yes=True, as_json=False)
251
+ rc = run_clean(branches=True, dry_run=False, yes=True, as_json=False)
250
252
  assert rc == 0
251
253
 
252
254
  r = subprocess.run(
@@ -265,16 +267,13 @@ def test_active_worktree_protected(
265
267
  )
266
268
 
267
269
 
268
- def test_clean_refs_not_implemented(
269
- monkeypatch: pytest.MonkeyPatch, tmp_git_repo_with_stale: Path, capsys
270
- ) -> None:
271
- """--refs is advertised but not implemented; it must fail closed with a v3 envelope."""
272
- import json
270
+ def test_clean_refs_absent_from_public_contract(tmp_git_repo: Path) -> None:
271
+ help_result = run_gitwise("clean", "--help", "--json", cwd=tmp_git_repo)
272
+ assert help_result.returncode == 0
273
+ options = json.loads(help_result.stdout)["data"]["options"]
274
+ assert all(option["name"] != "refs" for option in options)
273
275
 
274
- monkeypatch.chdir(tmp_git_repo_with_stale)
275
- rc = run_clean(branches=False, refs=True, dry_run=True, yes=True, as_json=True)
276
- assert rc == 1
277
- data = json.loads(capsys.readouterr().out)
278
- assert data["ok"] is False
279
- assert data["command"] == "clean"
280
- assert data["errors"][0]["code"] == "not_implemented"
276
+ schema_result = run_gitwise("schema", "clean", "--json", cwd=tmp_git_repo)
277
+ assert schema_result.returncode == 0
278
+ properties = json.loads(schema_result.stdout)["data"]["json_schema"]["properties"]
279
+ assert "refs" not in properties
@@ -1,5 +1,6 @@
1
1
  """Tests for gitwise snapshot."""
2
2
 
3
+ import json
3
4
  import time
4
5
 
5
6
  from conftest import run_gitwise as _run
@@ -12,6 +13,18 @@ def test_snapshot_creates_file(tmp_git_repo):
12
13
  assert snapshot.exists()
13
14
 
14
15
 
16
+ def test_snapshot_uses_agents_layout_when_present(tmp_git_repo):
17
+ (tmp_git_repo / ".agents").mkdir()
18
+
19
+ result = _run("snapshot", "--json", cwd=tmp_git_repo)
20
+
21
+ assert result.returncode == 0
22
+ data = json.loads(result.stdout)["data"]
23
+ assert data["path"].endswith(".agents/git-snapshot.md")
24
+ assert (tmp_git_repo / ".agents" / "git-snapshot.md").exists()
25
+ assert not (tmp_git_repo / ".claude" / "git-snapshot.md").exists()
26
+
27
+
15
28
  def test_snapshot_has_generated_at(tmp_git_repo):
16
29
  _run("snapshot", cwd=tmp_git_repo)
17
30
  content = (tmp_git_repo / ".claude" / "git-snapshot.md").read_text()
@@ -0,0 +1,65 @@
1
+ """Tests for the deprecated gitwise update command."""
2
+
3
+ import json
4
+ from pathlib import Path
5
+
6
+ import gitwise.update as update_module
7
+ import pytest
8
+
9
+
10
+ def _set_install_dir(
11
+ monkeypatch: pytest.MonkeyPatch, tmp_path: Path, *, source_clone: bool
12
+ ) -> Path:
13
+ package_dir = tmp_path / "gitwise"
14
+ package_dir.mkdir()
15
+ if source_clone:
16
+ (tmp_path / ".git").mkdir()
17
+ monkeypatch.setattr(update_module, "__file__", str(package_dir / "update.py"))
18
+ return tmp_path
19
+
20
+
21
+ def _assert_upgrade_channels(hints: list[str]) -> None:
22
+ combined = " ".join(hints)
23
+ assert "brew upgrade gitwise" in combined
24
+ assert "uv tool upgrade gitwise-cli" in combined
25
+
26
+
27
+ def test_update_non_clone_json_recommends_upgrade_channels(
28
+ monkeypatch: pytest.MonkeyPatch, tmp_path: Path, capsys: pytest.CaptureFixture
29
+ ) -> None:
30
+ _set_install_dir(monkeypatch, tmp_path, source_clone=False)
31
+
32
+ rc = update_module.run_update(as_json=True)
33
+
34
+ assert rc == 1
35
+ payload = json.loads(capsys.readouterr().out)
36
+ assert payload["errors"][0]["code"] == "update_requires_git_clone"
37
+ _assert_upgrade_channels(payload["hints"])
38
+
39
+
40
+ def test_update_clone_dry_run_json_preserves_behavior_and_recommends_channels(
41
+ monkeypatch: pytest.MonkeyPatch, tmp_path: Path, capsys: pytest.CaptureFixture
42
+ ) -> None:
43
+ install_dir = _set_install_dir(monkeypatch, tmp_path, source_clone=True)
44
+
45
+ rc = update_module.run_update(dry_run=True, as_json=True)
46
+
47
+ assert rc == 0
48
+ payload = json.loads(capsys.readouterr().out)
49
+ assert payload["data"]["dry_run"] is True
50
+ assert payload["data"]["dir"] == str(install_dir)
51
+ _assert_upgrade_channels(payload["hints"])
52
+
53
+
54
+ def test_update_clone_dry_run_human_warns_with_upgrade_channels(
55
+ monkeypatch: pytest.MonkeyPatch, tmp_path: Path, capsys: pytest.CaptureFixture
56
+ ) -> None:
57
+ _set_install_dir(monkeypatch, tmp_path, source_clone=True)
58
+
59
+ rc = update_module.run_update(dry_run=True)
60
+
61
+ assert rc == 0
62
+ captured = capsys.readouterr()
63
+ output = captured.out + captured.err
64
+ assert "brew upgrade gitwise" in output
65
+ assert "uv tool upgrade gitwise-cli" in output
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes