gitwise-cli 0.33.0__tar.gz → 0.34.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.33.0 → gitwise_cli-0.34.0}/CHANGELOG.md +53 -0
  2. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/PKG-INFO +2 -2
  3. gitwise_cli-0.34.0/bin/gw +5 -0
  4. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/__init__.py +1 -1
  5. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/__main__.py +12 -8
  6. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_cli_dispatch.py +50 -7
  7. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_cli_introspection.py +25 -5
  8. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_cli_parser.py +89 -4
  9. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_i18n_data.json +68 -0
  10. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/audit.py +1 -6
  11. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/branches.py +36 -12
  12. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/clean.py +18 -8
  13. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/commit.py +66 -31
  14. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/conflicts.py +61 -16
  15. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/context.py +1 -3
  16. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/diff.py +84 -17
  17. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/git.py +118 -8
  18. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/health.py +27 -10
  19. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/log.py +31 -4
  20. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/merge.py +1 -3
  21. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/optimize.py +7 -3
  22. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/output.py +24 -1
  23. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/pick.py +2 -4
  24. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/pr.py +145 -25
  25. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup.py +1 -3
  26. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/show.py +50 -24
  27. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/snapshot.py +1 -3
  28. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/stash.py +73 -3
  29. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/status.py +13 -5
  30. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/suggest.py +4 -4
  31. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/summarize.py +1 -3
  32. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/sync.py +56 -60
  33. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/tag.py +3 -5
  34. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/undo.py +1 -3
  35. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/update.py +12 -2
  36. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/secret_scan.py +18 -0
  37. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/worktree.py +65 -4
  38. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/install.sh +38 -1
  39. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/pyproject.toml +3 -2
  40. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/claude/rules/gitwise.md +1 -1
  41. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/claude/settings.json.template +1 -0
  42. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/codex/agents/gitwise.toml.template +1 -1
  43. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/branches.json +7 -0
  44. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/conflicts.json +12 -0
  45. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/diff.json +7 -0
  46. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/log.json +8 -0
  47. gitwise_cli-0.34.0/share/schemas/v1/input/pr.json +101 -0
  48. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/setup-agents.json +6 -6
  49. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/show.json +7 -0
  50. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/stash.json +23 -0
  51. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/worktree.json +7 -1
  52. gitwise_cli-0.34.0/share/schemas/v1/output/audit.json +115 -0
  53. gitwise_cli-0.34.0/share/schemas/v1/output/branches.json +75 -0
  54. gitwise_cli-0.34.0/share/schemas/v1/output/clean.json +58 -0
  55. gitwise_cli-0.34.0/share/schemas/v1/output/commands.json +46 -0
  56. gitwise_cli-0.34.0/share/schemas/v1/output/commit.json +74 -0
  57. gitwise_cli-0.34.0/share/schemas/v1/output/conflicts.json +88 -0
  58. gitwise_cli-0.34.0/share/schemas/v1/output/context.json +58 -0
  59. gitwise_cli-0.34.0/share/schemas/v1/output/doctor.json +58 -0
  60. gitwise_cli-0.34.0/share/schemas/v1/output/health.json +118 -0
  61. gitwise_cli-0.34.0/share/schemas/v1/output/merge.json +91 -0
  62. gitwise_cli-0.34.0/share/schemas/v1/output/optimize.json +50 -0
  63. gitwise_cli-0.34.0/share/schemas/v1/output/pick.json +77 -0
  64. gitwise_cli-0.34.0/share/schemas/v1/output/pr.json +103 -0
  65. gitwise_cli-0.34.0/share/schemas/v1/output/setup.json +68 -0
  66. gitwise_cli-0.34.0/share/schemas/v1/output/snapshot.json +62 -0
  67. gitwise_cli-0.34.0/share/schemas/v1/output/stash.json +101 -0
  68. gitwise_cli-0.34.0/share/schemas/v1/output/suggest.json +80 -0
  69. gitwise_cli-0.34.0/share/schemas/v1/output/summarize.json +41 -0
  70. gitwise_cli-0.34.0/share/schemas/v1/output/sync.json +58 -0
  71. gitwise_cli-0.34.0/share/schemas/v1/output/tag.json +81 -0
  72. gitwise_cli-0.34.0/share/schemas/v1/output/undo.json +74 -0
  73. gitwise_cli-0.34.0/share/schemas/v1/output/update.json +71 -0
  74. gitwise_cli-0.34.0/share/schemas/v1/output/worktree.json +95 -0
  75. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_branches.py +8 -0
  76. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_clean.py +15 -0
  77. gitwise_cli-0.34.0/tests/test_commands.py +38 -0
  78. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_commit.py +44 -2
  79. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_conflicts.py +36 -0
  80. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_diff.py +24 -0
  81. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_git.py +78 -4
  82. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_log.py +8 -0
  83. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_main.py +19 -14
  84. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_pr.py +77 -9
  85. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_secret_scan.py +12 -1
  86. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_show.py +19 -0
  87. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_stash.py +18 -0
  88. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_status.py +1 -1
  89. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_worktree.py +18 -0
  90. gitwise_cli-0.33.0/share/schemas/v1/input/pr.json +0 -51
  91. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/.gitignore +0 -0
  92. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/LICENSE +0 -0
  93. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/README.md +0 -0
  94. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/bin/gitwise +0 -0
  95. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_cli_completions.py +0 -0
  96. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_cli_setup_agents.py +0 -0
  97. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_paths.py +0 -0
  98. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/_runtime_config.py +0 -0
  99. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/design.py +0 -0
  100. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/doctor.py +0 -0
  101. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/i18n.py +0 -0
  102. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/py.typed +0 -0
  103. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/schema.py +0 -0
  104. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/__init__.py +0 -0
  105. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/__init__.py +0 -0
  106. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/aider.py +0 -0
  107. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/base.py +0 -0
  108. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/codex.py +0 -0
  109. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/continue_adapter.py +0 -0
  110. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/cursor.py +0 -0
  111. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/opencode.py +0 -0
  112. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/pi.py +0 -0
  113. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/exec.py +0 -0
  114. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/format.py +0 -0
  115. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/plan.py +0 -0
  116. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/plan_gitfiles.py +0 -0
  117. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/plan_skills.py +0 -0
  118. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/__init__.py +0 -0
  119. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/aider.py +0 -0
  120. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/base.py +0 -0
  121. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/claude.py +0 -0
  122. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/codex.py +0 -0
  123. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/continue_adapter.py +0 -0
  124. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/cursor.py +0 -0
  125. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/opencode.py +0 -0
  126. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/pi.py +0 -0
  127. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/state.py +0 -0
  128. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/setup_agents/types.py +0 -0
  129. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/__init__.py +0 -0
  130. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/git_output.py +0 -0
  131. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/in_progress.py +0 -0
  132. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/json_envelope.py +0 -0
  133. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/parsing.py +0 -0
  134. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/gitwise/utils/types.py +0 -0
  135. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/agents/skills/git-audit/SKILL.md +0 -0
  136. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/agents/skills/git-clean/SKILL.md +0 -0
  137. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/agents/skills/git-optimize/SKILL.md +0 -0
  138. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/aider/CONVENTIONS.md.template +0 -0
  139. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/aider/aider.conf.yml.template +0 -0
  140. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/claude/CLAUDE.md.template +0 -0
  141. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/claude/skills/git-audit/SKILL.md +0 -0
  142. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/claude/skills/git-clean/SKILL.md +0 -0
  143. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/claude/skills/git-optimize/SKILL.md +0 -0
  144. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/continue/rules/gitwise.md.template +0 -0
  145. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/cursor/rules/gitwise.mdc.template +0 -0
  146. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/git-config-modern.txt +0 -0
  147. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/hooks/commit-msg +0 -0
  148. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/hooks/pre-commit +0 -0
  149. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/opencode/agents/gitwise.md.template +0 -0
  150. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/pi/skills/gitwise.md.template +0 -0
  151. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/audit.json +0 -0
  152. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/clean.json +0 -0
  153. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/commands.json +0 -0
  154. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/commit.json +0 -0
  155. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/completions.json +0 -0
  156. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/context.json +0 -0
  157. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/doctor.json +0 -0
  158. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/health.json +0 -0
  159. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/merge.json +0 -0
  160. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/optimize.json +0 -0
  161. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/pick.json +0 -0
  162. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/schema.json +0 -0
  163. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/setup.json +0 -0
  164. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/snapshot.json +0 -0
  165. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/status.json +0 -0
  166. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/suggest.json +0 -0
  167. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/summarize.json +0 -0
  168. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/sync.json +0 -0
  169. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/tag.json +0 -0
  170. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/undo.json +0 -0
  171. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/input/update.json +0 -0
  172. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/output/diff.json +0 -0
  173. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/output/log.json +0 -0
  174. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/output/setup-agents.json +0 -0
  175. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/share/schemas/v1/output/status.json +0 -0
  176. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/__init__.py +0 -0
  177. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/conftest.py +0 -0
  178. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_adapters.py +0 -0
  179. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_audit.py +0 -0
  180. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_context.py +0 -0
  181. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_design.py +0 -0
  182. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_doctor.py +0 -0
  183. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_edge_cases.py +0 -0
  184. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_envelope_contract.py +0 -0
  185. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_git_output_utils.py +0 -0
  186. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_health.py +0 -0
  187. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_i18n.py +0 -0
  188. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_in_progress.py +0 -0
  189. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_json_envelope_utils.py +0 -0
  190. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_md_links_script.py +0 -0
  191. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_merge.py +0 -0
  192. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_optimize.py +0 -0
  193. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_output.py +0 -0
  194. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_parsing_utils.py +0 -0
  195. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_pick.py +0 -0
  196. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_roadmap_baseline_script.py +0 -0
  197. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_sa_plan.py +0 -0
  198. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_sa_unit.py +0 -0
  199. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_schema_catalog.py +0 -0
  200. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_setup.py +0 -0
  201. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_setup_agents.py +0 -0
  202. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_snapshot.py +0 -0
  203. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_suggest.py +0 -0
  204. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_summarize.py +0 -0
  205. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_sync.py +0 -0
  206. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_sync_changelog_es_script.py +0 -0
  207. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_tag.py +0 -0
  208. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_types.py +0 -0
  209. {gitwise_cli-0.33.0 → gitwise_cli-0.34.0}/tests/test_undo.py +0 -0
@@ -3,6 +3,59 @@
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.34.0 (2026-06-25)
7
+
8
+ ### BREAKING CHANGE
9
+
10
+ - the --help --json and bare --json output shape changed
11
+ from flat top-level fields (kind/scope/commands/options) to the standard
12
+ v3 envelope with those fields nested under data. Pin to gitwise <0.34 or
13
+ read from payload.data if you consumed the old flat layout.
14
+
15
+ ### Feat
16
+
17
+ - **schema**: add output schemas for all JSON-emitting commands
18
+ - **pr**: add list filters and create action
19
+ - **stash,worktree**: add stash push/apply and worktree remove
20
+ - **diff,log,show,branches**: add --git-arg passthrough with safety deny-list
21
+ - **conflicts**: add --dry-run and --files for safe, scoped resolution
22
+ - expose json-lines capability, scrub git config env, surface sync upstream
23
+
24
+ ### Fix
25
+
26
+ - close last 3 review comments (limit min, health details, test pin)
27
+ - close remaining CodeRabbit comments (JSON contract, schemas, nits)
28
+ - windows installer temp file + complete remaining review comments
29
+ - address PR review comments (security, JSON contract, tests, schemas)
30
+ - resolve multi-review gate findings on the branch
31
+ - **install**: optional SHA-256 verification for the uv installer
32
+ - **schema**: regenerate conflicts input schema to canonical form
33
+ - **diff**: validate refspec before forwarding to git (defense-in-depth)
34
+ - add explicit machine error codes to all error envelopes
35
+ - **cli**: unify help JSON to the v3 envelope shape
36
+ - **diff,commit**: redact secret previews from JSON output
37
+ - **git**: handle subprocess timeout and reject zero GITWISE_GIT_TIMEOUT
38
+ - **show,commit**: emit JSON error envelopes on failure paths
39
+ - **commit**: block --allow-secret bypass in agent (JSON) mode
40
+
41
+ ### Refactor
42
+
43
+ - **health**: centralize score thresholds as named constants
44
+ - **output**: central report_error helper, migrate sync/show/commit
45
+ - **git**: simplify require_root to return Path | None
46
+ - remove dead emoji constant, inline trivial wrapper, type _gh cwd
47
+ - **setup-agents**: use shared schema constants in provider-list JSON
48
+
49
+ ### Perf
50
+
51
+ - **diff,status**: run independent git calls concurrently
52
+
53
+ ## v0.33.1 (2026-06-23)
54
+
55
+ ### Fix
56
+
57
+ - make gw a real binary for non-interactive shells (#80)
58
+
6
59
  ## v0.33.0 (2026-06-20)
7
60
 
8
61
  ### Feat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitwise-cli
3
- Version: 0.33.0
3
+ Version: 0.34.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
@@ -27,7 +27,7 @@ Classifier: Topic :: Software Development :: Version Control :: Git
27
27
  Classifier: Typing :: Typed
28
28
  Requires-Python: >=3.10
29
29
  Requires-Dist: rich-argparse<2,>=1.8.0
30
- Requires-Dist: rich<15,>=13.0
30
+ Requires-Dist: rich<16,>=13.0
31
31
  Requires-Dist: shtab<2,>=1.8.0
32
32
  Description-Content-Type: text/markdown
33
33
 
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ # gw -- short wrapper for gitwise. See bin/gitwise for Python resolution logic.
3
+ set -Eeuo pipefail
4
+ _dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
5
+ exec "$_dir/gitwise" "$@"
@@ -1,6 +1,6 @@
1
1
  """gitwise -- CLI for optimizing git workflows and coding-agent integration."""
2
2
 
3
- __version__ = "0.33.0"
3
+ __version__ = "0.34.0"
4
4
 
5
5
 
6
6
  def get_version() -> str:
@@ -1,10 +1,10 @@
1
- """CLI entry point argparse router for all gitwise subcommands."""
1
+ """CLI entry point -- argparse router for all gitwise subcommands."""
2
2
 
3
3
  import sys
4
4
  import time
5
5
 
6
6
  from ._cli_dispatch import DISPATCH
7
- from ._cli_introspection import extract_command_token, help_payload
7
+ from ._cli_introspection import extract_command_token, help_data, help_payload
8
8
  from ._cli_parser import build_parser
9
9
  from .i18n import t
10
10
  from .output import print_dim, print_json, set_json_mode, set_json_pretty
@@ -40,7 +40,7 @@ def _ensure_utf8_stdio() -> None:
40
40
 
41
41
  Windows defaults to a system codepage (often cp1252) for the Python
42
42
  embedded in console apps. That codepage cannot encode characters like
43
- U+2713 () used throughout gitwise's status output, causing
43
+ U+2713 (check mark) used throughout gitwise's status output, causing
44
44
  UnicodeEncodeError when the user is not running through a wrapper that
45
45
  sets PYTHONIOENCODING. macOS/Linux are already UTF-8 by default, so
46
46
  this reconfigure is a no-op there.
@@ -88,12 +88,16 @@ def main() -> int:
88
88
 
89
89
  if args.command is None:
90
90
  if args.json:
91
+ from .utils.json_envelope import error_envelope
92
+
91
93
  print_json(
92
- {
93
- **help_payload(parser),
94
- "ok": False,
95
- "error": "missing_command",
96
- }
94
+ error_envelope(
95
+ "gitwise",
96
+ error="no subcommand provided: run `gitwise --help` to list commands",
97
+ code="missing_command",
98
+ hint="try `gitwise --help`",
99
+ data=help_data(parser),
100
+ )
97
101
  )
98
102
  return 1
99
103
  parser.print_usage(sys.stderr)
@@ -35,14 +35,18 @@ def _run_setup_agents(args: argparse.Namespace) -> int:
35
35
  """Dispatch to ``setup-agents`` subcommand, handling provider listing."""
36
36
  if getattr(args, "list_providers", False) or getattr(args, "list_adapters", False):
37
37
  from gitwise.i18n import t as _t
38
+ from gitwise.setup_agents.format import (
39
+ _SETUP_AGENTS_SCHEMA_COMPAT,
40
+ _SETUP_AGENTS_SCHEMA_VERSION,
41
+ )
38
42
  from gitwise.setup_agents.providers import list_providers
39
43
 
40
44
  adapter_list = list_providers()
41
45
  if args.json:
42
46
  print_json(
43
47
  {
44
- "v": 3,
45
- "v_compat": [1, 2, 3],
48
+ "v": _SETUP_AGENTS_SCHEMA_VERSION,
49
+ "v_compat": _SETUP_AGENTS_SCHEMA_COMPAT,
46
50
  "command": "setup-agents",
47
51
  "hints": [],
48
52
  "errors": [],
@@ -140,7 +144,11 @@ def _run_worktree(args: argparse.Namespace) -> int:
140
144
  from gitwise.worktree import run_worktree
141
145
 
142
146
  return run_worktree(
143
- args.action, getattr(args, "branch", None), dry_run=args.dry_run, as_json=args.json
147
+ args.action,
148
+ getattr(args, "branch", None),
149
+ dry_run=args.dry_run,
150
+ as_json=args.json,
151
+ force=getattr(args, "force", False),
144
152
  )
145
153
 
146
154
 
@@ -207,6 +215,7 @@ def _run_diff(args: argparse.Namespace) -> int:
207
215
  scan_secrets=args.scan_secrets,
208
216
  as_json=args.json,
209
217
  json_lines=getattr(args, "json_lines", False),
218
+ git_args=getattr(args, "git_args", None),
210
219
  )
211
220
 
212
221
 
@@ -225,6 +234,7 @@ def _run_log(args: argparse.Namespace) -> int:
225
234
  until=args.until,
226
235
  file=args.file,
227
236
  max_count=args.max_count,
237
+ git_args=getattr(args, "git_args", None),
228
238
  )
229
239
 
230
240
 
@@ -232,7 +242,9 @@ def _run_show(args: argparse.Namespace) -> int:
232
242
  """Dispatch to ``show`` subcommand."""
233
243
  from gitwise.show import run_show
234
244
 
235
- return run_show(ref=args.ref, stat=args.stat, as_json=args.json)
245
+ return run_show(
246
+ ref=args.ref, stat=args.stat, as_json=args.json, git_args=getattr(args, "git_args", None)
247
+ )
236
248
 
237
249
 
238
250
  def _run_commit(args: argparse.Namespace) -> int:
@@ -255,7 +267,13 @@ def _run_branches(args: argparse.Namespace) -> int:
255
267
  """Dispatch to ``branches`` subcommand."""
256
268
  from gitwise.branches import run_branches
257
269
 
258
- return run_branches(stale=args.stale, remote=args.remote, sort=args.sort, as_json=args.json)
270
+ return run_branches(
271
+ stale=args.stale,
272
+ remote=args.remote,
273
+ sort=args.sort,
274
+ as_json=args.json,
275
+ git_args=getattr(args, "git_args", None),
276
+ )
259
277
 
260
278
 
261
279
  def _run_sync(args: argparse.Namespace) -> int:
@@ -275,7 +293,21 @@ def _run_pr(args: argparse.Namespace) -> int:
275
293
  """Dispatch to ``pr`` subcommand."""
276
294
  from gitwise.pr import run_pr
277
295
 
278
- return run_pr(action=args.action, selector=args.selector, as_json=args.json)
296
+ return run_pr(
297
+ action=args.action,
298
+ selector=args.selector,
299
+ as_json=args.json,
300
+ state=getattr(args, "state", None),
301
+ author=getattr(args, "author", None),
302
+ label=getattr(args, "label", None),
303
+ limit=getattr(args, "limit", None),
304
+ base=getattr(args, "base", None),
305
+ head=getattr(args, "head", None),
306
+ title=getattr(args, "title", None),
307
+ body=getattr(args, "body", None),
308
+ draft=getattr(args, "draft", False),
309
+ fill=getattr(args, "fill", False),
310
+ )
279
311
 
280
312
 
281
313
  def _run_undo(args: argparse.Namespace) -> int:
@@ -317,6 +349,10 @@ def _run_stash(args: argparse.Namespace) -> int:
317
349
  yes=args.yes,
318
350
  dry_run=args.dry_run,
319
351
  patch=args.patch,
352
+ message=getattr(args, "message", None),
353
+ include_untracked=getattr(args, "include_untracked", False),
354
+ keep_index=getattr(args, "keep_index", False),
355
+ paths=getattr(args, "paths", None),
320
356
  )
321
357
 
322
358
 
@@ -355,7 +391,14 @@ def _run_conflicts(args: argparse.Namespace) -> int:
355
391
  """Dispatch to ``conflicts`` subcommand."""
356
392
  from gitwise.conflicts import run_conflicts
357
393
 
358
- return run_conflicts(ours=args.ours, theirs=args.theirs, union=args.union, as_json=args.json)
394
+ return run_conflicts(
395
+ ours=args.ours,
396
+ theirs=args.theirs,
397
+ union=args.union,
398
+ files=getattr(args, "files", None),
399
+ dry_run=getattr(args, "dry_run", False),
400
+ as_json=args.json,
401
+ )
359
402
 
360
403
 
361
404
  def _run_suggest(args: argparse.Namespace) -> int:
@@ -4,6 +4,7 @@ import argparse
4
4
  from typing import TypedDict
5
5
 
6
6
  from . import __version__
7
+ from .utils.json_envelope import ok_envelope
7
8
 
8
9
 
9
10
  def _json_safe(value: object) -> object:
@@ -67,11 +68,13 @@ def extract_command_token(argv: list[str]) -> str | None:
67
68
  return None
68
69
 
69
70
 
70
- def help_payload(parser: argparse.ArgumentParser, command: str | None = None) -> dict[str, object]:
71
- """Build a structured help payload for the root parser or a specific subcommand."""
71
+ def help_data(parser: argparse.ArgumentParser, command: str | None = None) -> dict[str, object]:
72
+ """Build the inner data dict for a structured help payload.
73
+
74
+ Returned nested under ``data`` by :func:`help_payload` so every ``--json``
75
+ output -- help included -- shares the v3 envelope shape.
76
+ """
72
77
  payload: dict[str, object] = {
73
- "v": 2,
74
- "ok": True,
75
78
  "kind": "help",
76
79
  "schema": "gitwise/help/v1",
77
80
  "version": __version__,
@@ -134,6 +137,11 @@ def help_payload(parser: argparse.ArgumentParser, command: str | None = None) ->
134
137
  return payload
135
138
 
136
139
 
140
+ def help_payload(parser: argparse.ArgumentParser, command: str | None = None) -> dict[str, object]:
141
+ """Build a v3-envelope structured help payload for the root parser or a subcommand."""
142
+ return ok_envelope("help", data=help_data(parser, command))
143
+
144
+
137
145
  class CommandMetadata(TypedDict):
138
146
  """Minimal metadata for a single subcommand."""
139
147
 
@@ -141,6 +149,11 @@ class CommandMetadata(TypedDict):
141
149
  help: str
142
150
  aliases: list[str]
143
151
  supports_json: bool
152
+ supports_json_lines: bool
153
+
154
+
155
+ # Subcommands that stream one JSON envelope per record (NDJSON) via --json-lines.
156
+ _JSON_LINES_COMMANDS: frozenset[str] = frozenset({"diff", "log"})
144
157
 
145
158
 
146
159
  def canonical_command_name(command_parser: argparse.ArgumentParser) -> str:
@@ -191,6 +204,7 @@ def commands_metadata(parser: argparse.ArgumentParser) -> list[CommandMetadata]:
191
204
  "help": help_by_parser_id.get(parser_id, command_parser.description or ""),
192
205
  "aliases": aliases,
193
206
  "supports_json": True,
207
+ "supports_json_lines": name in _JSON_LINES_COMMANDS,
194
208
  }
195
209
  )
196
210
 
@@ -217,6 +231,11 @@ def _action_property_schema(action: argparse.Action) -> dict[str, object]:
217
231
  if action.choices:
218
232
  value_schema["enum"] = [_json_safe(choice) for choice in action.choices]
219
233
 
234
+ # A "limit"/"max-count" argument is a positive-integer bound; surface that
235
+ # in the input schema so consumers know 0/negative are invalid.
236
+ if value_schema["type"] == "integer" and action.dest in {"limit", "max_count", "maxcount"}:
237
+ value_schema["minimum"] = 1
238
+
220
239
  description = "" if action.help is argparse.SUPPRESS else (action.help or "")
221
240
  if description:
222
241
  value_schema["description"] = description
@@ -225,7 +244,8 @@ def _action_property_schema(action: argparse.Action) -> dict[str, object]:
225
244
  value_schema["default"] = _json_safe(action.default)
226
245
 
227
246
  nargs = action.nargs
228
- if nargs in ("*", "+") or (isinstance(nargs, int) and nargs > 1):
247
+ is_append = isinstance(action, argparse._AppendAction)
248
+ if is_append or nargs in ("*", "+") or (isinstance(nargs, int) and nargs > 1):
229
249
  array_schema: dict[str, object] = {
230
250
  "type": "array",
231
251
  "items": value_schema,
@@ -70,7 +70,7 @@ def build_parser() -> argparse.ArgumentParser:
70
70
  p.add_argument(
71
71
  "--no-symlinks",
72
72
  action="store_true",
73
- help="force @AGENTS.md import fallback (no symlinks) — --local only",
73
+ help="force @AGENTS.md import fallback (no symlinks)",
74
74
  )
75
75
  p.add_argument(
76
76
  "--strict",
@@ -163,9 +163,17 @@ def build_parser() -> argparse.ArgumentParser:
163
163
  p.add_argument("--yes", "-y", action="store_true")
164
164
 
165
165
  p = sub.add_parser("worktree", help="worktree helpers for Claude agents", parents=[parent])
166
- p.add_argument("action", choices=["new", "clean", "list"], nargs="?", metavar="new|clean|list")
166
+ p.add_argument(
167
+ "action",
168
+ choices=["new", "clean", "list", "remove"],
169
+ nargs="?",
170
+ metavar="new|clean|list|remove",
171
+ )
167
172
  p.add_argument("branch", nargs="?")
168
173
  p.add_argument("--dry-run", action="store_true")
174
+ p.add_argument(
175
+ "--force", action="store_true", help="force removal even with modifications (remove only)"
176
+ )
169
177
 
170
178
  p = sub.add_parser(
171
179
  "diff",
@@ -207,6 +215,15 @@ def build_parser() -> argparse.ArgumentParser:
207
215
  metavar="PATH",
208
216
  help="limit to paths (use -- to separate from refspec)",
209
217
  )
218
+ p.add_argument(
219
+ "--git-arg",
220
+ action="append",
221
+ dest="git_args",
222
+ default=None,
223
+ metavar="OPT",
224
+ help="forward an extra option to the underlying git diff (repeatable; "
225
+ "code-exec/write/redirect options like --output/-c/--git-dir are refused)",
226
+ )
210
227
 
211
228
  p = sub.add_parser("log", help="pretty git log with filters", parents=[parent])
212
229
  p.add_argument("--oneline", action="store_true", help="one line per commit")
@@ -223,10 +240,28 @@ def build_parser() -> argparse.ArgumentParser:
223
240
  dest="json_lines",
224
241
  help="stream one JSON envelope per commit (NDJSON; implies JSON mode)",
225
242
  )
243
+ p.add_argument(
244
+ "--git-arg",
245
+ action="append",
246
+ dest="git_args",
247
+ default=None,
248
+ metavar="OPT",
249
+ help="forward an extra option to the underlying git log (repeatable; "
250
+ "code-exec/write/redirect options are refused)",
251
+ )
226
252
 
227
253
  p = sub.add_parser("show", help="commit inspector", parents=[parent])
228
254
  p.add_argument("ref", nargs="?", default="HEAD", help="commit ref (default: HEAD)")
229
255
  p.add_argument("--stat", action="store_true", help="show diffstat")
256
+ p.add_argument(
257
+ "--git-arg",
258
+ action="append",
259
+ dest="git_args",
260
+ default=None,
261
+ metavar="OPT",
262
+ help="forward an extra option to the underlying git show (repeatable; "
263
+ "code-exec/write/redirect options are refused)",
264
+ )
230
265
 
231
266
  p = sub.add_parser("commit", help="smart conventional commit", parents=[parent])
232
267
  p.add_argument("-m", "--message", type=str, default=None, help="commit message")
@@ -250,6 +285,15 @@ def build_parser() -> argparse.ArgumentParser:
250
285
  default="refname",
251
286
  help="sort field: refname, committerdate, -committerdate",
252
287
  )
288
+ p.add_argument(
289
+ "--git-arg",
290
+ action="append",
291
+ dest="git_args",
292
+ default=None,
293
+ metavar="OPT",
294
+ help="forward an extra option to the underlying git for-each-ref (repeatable; "
295
+ "code-exec/write/redirect options are refused)",
296
+ )
253
297
 
254
298
  p = sub.add_parser("sync", help="remote fetch, safe pull/push", parents=[parent])
255
299
  p.add_argument("--pull", action="store_true", help="pull --ff-only after fetch")
@@ -262,7 +306,7 @@ def build_parser() -> argparse.ArgumentParser:
262
306
  "action",
263
307
  nargs="?",
264
308
  default="list",
265
- choices=["list", "checks", "view", "comments"],
309
+ choices=["list", "checks", "view", "comments", "create"],
266
310
  help="pr action",
267
311
  )
268
312
  p.add_argument(
@@ -271,6 +315,23 @@ def build_parser() -> argparse.ArgumentParser:
271
315
  default=None,
272
316
  help="PR number/url/branch (default: current branch PR)",
273
317
  )
318
+ # pr list filters
319
+ p.add_argument(
320
+ "--state",
321
+ default=None,
322
+ choices=["open", "closed", "merged", "all"],
323
+ help="filter by state: open,closed,merged,all (list)",
324
+ )
325
+ p.add_argument("--author", default=None, help="filter by author login (list)")
326
+ p.add_argument("--label", default=None, help="filter by label (list)")
327
+ p.add_argument("--limit", type=int, default=None, help="max PRs to list")
328
+ p.add_argument("--base", default=None, help="base branch (list/create)")
329
+ p.add_argument("--head", default=None, help="head branch (list/create)")
330
+ # pr create
331
+ p.add_argument("--title", default=None, help="PR title (create)")
332
+ p.add_argument("--body", default=None, help="PR body (create)")
333
+ p.add_argument("--draft", action="store_true", help="create as draft")
334
+ p.add_argument("--fill", action="store_true", help="use commit info for title/body (create)")
274
335
 
275
336
  p = sub.add_parser("undo", help="reflog-based undo", parents=[parent])
276
337
  p.add_argument("ref", nargs="?", default=None, help="target ref (default: HEAD~1)")
@@ -292,12 +353,25 @@ def build_parser() -> argparse.ArgumentParser:
292
353
  "action",
293
354
  nargs="?",
294
355
  default="list",
295
- choices=["list", "show", "pop", "drop", "clear", "clean"],
356
+ choices=["list", "show", "pop", "apply", "push", "drop", "clear", "clean"],
296
357
  )
297
358
  p.add_argument("--index", type=int, default=0, help="stash index (default: 0)")
298
359
  p.add_argument("--dry-run", action="store_true", help="dry run (clear only)")
299
360
  p.add_argument("--yes", "-y", action="store_true", help="skip confirmation")
300
361
  p.add_argument("--patch", action="store_true", help="show full patch (show only)")
362
+ p.add_argument("-m", "--message", type=str, default=None, help="stash message (push only)")
363
+ p.add_argument(
364
+ "-u",
365
+ "--include-untracked",
366
+ action="store_true",
367
+ help="include untracked files (push only)",
368
+ )
369
+ p.add_argument(
370
+ "--keep-index", action="store_true", help="keep staged changes in the index (push only)"
371
+ )
372
+ p.add_argument(
373
+ "paths", nargs="*", default=None, help="paths to stash (push only, use -- to separate)"
374
+ )
301
375
 
302
376
  p = sub.add_parser("tag", help="semver-aware tag management", parents=[parent])
303
377
  p.add_argument(
@@ -338,6 +412,17 @@ def build_parser() -> argparse.ArgumentParser:
338
412
  action="store_true",
339
413
  help="resolve all conflicts keeping both sides (union)",
340
414
  )
415
+ p.add_argument(
416
+ "--files",
417
+ nargs="*",
418
+ default=None,
419
+ help="limit resolution to these files (use -- to separate from flags)",
420
+ )
421
+ p.add_argument(
422
+ "--dry-run",
423
+ action="store_true",
424
+ help="show what would be resolved without touching the working tree",
425
+ )
341
426
 
342
427
  p = sub.add_parser(
343
428
  "suggest",
@@ -343,6 +343,10 @@
343
343
  "es": "No hay conflictos",
344
344
  "en": "No conflicts"
345
345
  },
346
+ "conflicts_dry_run": {
347
+ "es": "Se resolverían {count} conflicto(s) con --{strategy} (dry-run):",
348
+ "en": "Would resolve {count} conflict(s) with --{strategy} (dry-run):"
349
+ },
346
350
  "conflicts_resolved_ours": {
347
351
  "es": "{count} conflicto(s) resuelto(s) con ours",
348
352
  "en": "{count} conflict(s) resolved with ours"
@@ -495,6 +499,14 @@
495
499
  "es": "Se detectaron {count} secreto(s) de alta severidad. ¿Commitear de todos modos?",
496
500
  "en": "{count} high-severity secret(s) detected. Commit anyway?"
497
501
  },
502
+ "secret_allow_requires_env": {
503
+ "es": "--allow-secret está bloqueado en modo --json: un agente no puede silenciar la confirmación humana de un secreto sin autorización fuera de banda",
504
+ "en": "--allow-secret is blocked in --json mode: an agent cannot silence the human confirmation of a secret without out-of-band authorization"
505
+ },
506
+ "secret_allow_requires_env_hint": {
507
+ "es": "para forzarlo en modo agente, exporte GITWISE_ALLOW_SECRETS=1 (controlado por el operador/CI, no por el prompt)",
508
+ "en": "to force it in agent mode, export GITWISE_ALLOW_SECRETS=1 (operator/CI-controlled, not prompt-settable)"
509
+ },
498
510
  "secret_scan_medium_warning": {
499
511
  "es": "advertencia: {rule} en {path}:{line} ({preview})",
500
512
  "en": "warning: {rule} at {path}:{line} ({preview})"
@@ -1287,6 +1299,34 @@
1287
1299
  "es": "no hay pull requests abiertos",
1288
1300
  "en": "no open pull requests"
1289
1301
  },
1302
+ "pr_create_needs_title": {
1303
+ "es": "pr create requiere --title (o --fill para usar el commit)",
1304
+ "en": "pr create requires --title (or --fill to use the commit message)"
1305
+ },
1306
+ "pr_list_failed": {
1307
+ "es": "pr list falló",
1308
+ "en": "pr list failed"
1309
+ },
1310
+ "pr_checks_failed": {
1311
+ "es": "pr checks falló",
1312
+ "en": "pr checks failed"
1313
+ },
1314
+ "pr_view_failed": {
1315
+ "es": "pr view falló",
1316
+ "en": "pr view failed"
1317
+ },
1318
+ "pr_comments_failed": {
1319
+ "es": "pr comments falló",
1320
+ "en": "pr comments failed"
1321
+ },
1322
+ "pr_create_failed": {
1323
+ "es": "no se pudo crear el pull request",
1324
+ "en": "failed to create pull request"
1325
+ },
1326
+ "pr_created": {
1327
+ "es": "pull request creado: {url}",
1328
+ "en": "pull request created: {url}"
1329
+ },
1290
1330
  "pr_unknown_action": {
1291
1331
  "es": "acción desconocida: {action}. Usa: list, checks, view, comments",
1292
1332
  "en": "unknown action: {action}. Use: list, checks, view, comments"
@@ -1559,6 +1599,18 @@
1559
1599
  "es": "Stash {ref} restaurado",
1560
1600
  "en": "Stash {ref} restored"
1561
1601
  },
1602
+ "stash_applied": {
1603
+ "es": "Stash {ref} aplicado (sin eliminar)",
1604
+ "en": "Stash {ref} applied (not removed)"
1605
+ },
1606
+ "stash_pushed": {
1607
+ "es": "Cambios guardados en un nuevo stash",
1608
+ "en": "Changes saved to a new stash"
1609
+ },
1610
+ "stash_push_failed": {
1611
+ "es": "No se pudo crear el stash (¿no hay cambios?)",
1612
+ "en": "Failed to create stash (no changes?)"
1613
+ },
1562
1614
  "stash_hint": {
1563
1615
  "es": "Usa 'gitwise stash list' para ver índices válidos antes de show/drop/pop.",
1564
1616
  "en": "Use 'gitwise stash list' to inspect valid indexes before show/drop/pop."
@@ -1827,6 +1879,10 @@
1827
1879
  "es": "pull falló: el branch local y el remoto han divergido (gitwise sync usa --ff-only por seguridad)",
1828
1880
  "en": "pull failed: local and remote have diverged (gitwise sync uses --ff-only for safety)"
1829
1881
  },
1882
+ "sync_pull_failed": {
1883
+ "es": "pull falló (¿sin upstream, error de red o árbol sucio?)",
1884
+ "en": "pull failed (no upstream, network error, or dirty tree?)"
1885
+ },
1830
1886
  "sync_pull_diverged_hint": {
1831
1887
  "es": "Inspecciona el estado con: gitwise sync --dry-run --json. Reconcilia con: git pull --rebase (recomendado) o git pull --no-rebase. Luego: gitwise sync --push.",
1832
1888
  "en": "Inspect state with: gitwise sync --dry-run --json. Reconcile with: git pull --rebase (recommended) or git pull --no-rebase. Then: gitwise sync --push."
@@ -2051,6 +2107,18 @@
2051
2107
  "es": "worktree creado: {path}",
2052
2108
  "en": "worktree created: {path}"
2053
2109
  },
2110
+ "worktree_removed": {
2111
+ "es": "worktree eliminado: {path}",
2112
+ "en": "worktree removed: {path}"
2113
+ },
2114
+ "worktree_not_found": {
2115
+ "es": "no se encontro un worktree para: {target}",
2116
+ "en": "no worktree found for: {target}"
2117
+ },
2118
+ "worktree_remove_primary": {
2119
+ "es": "no se puede eliminar el worktree principal",
2120
+ "en": "cannot remove the primary worktree"
2121
+ },
2054
2122
  "worktree_failed": {
2055
2123
  "es": "no se pudo crear worktree: {error}",
2056
2124
  "en": "could not create worktree: {error}"
@@ -167,18 +167,13 @@ def _check_gpg_findings(gpg: dict) -> list[dict]:
167
167
  return []
168
168
 
169
169
 
170
- _SEVERITY_ICON = {"critical": "🔴", "high": "🟠", "medium": "🟡", "low": "🔵", "info": "ℹ️"}
171
-
172
-
173
170
  def run_audit(*, quick: bool = False, as_json: bool = False) -> int:
174
171
  """Run all diagnostic checks and report findings.
175
172
 
176
173
  Returns 0 when no critical/high/medium findings exist, 1 otherwise.
177
174
  ``--quick`` skips large-blob scanning and git-sizer.
178
175
  """
179
- root, err = require_root()
180
- if err:
181
- return err
176
+ root = require_root(as_json=as_json, command="audit")
182
177
  if root is None:
183
178
  return 1
184
179
  cwd = root