gitwise-cli 0.33.1__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.
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/CHANGELOG.md +47 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/PKG-INFO +1 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/__init__.py +1 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/__main__.py +12 -8
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_cli_dispatch.py +50 -7
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_cli_introspection.py +25 -5
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_cli_parser.py +89 -4
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_i18n_data.json +68 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/audit.py +1 -6
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/branches.py +36 -12
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/clean.py +18 -8
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/commit.py +66 -31
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/conflicts.py +61 -16
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/context.py +1 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/diff.py +84 -17
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/git.py +118 -8
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/health.py +27 -10
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/log.py +31 -4
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/merge.py +1 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/optimize.py +7 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/output.py +24 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/pick.py +2 -4
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/pr.py +145 -25
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup.py +1 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/show.py +50 -24
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/snapshot.py +1 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/stash.py +73 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/status.py +13 -5
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/suggest.py +4 -4
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/summarize.py +1 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/sync.py +56 -60
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/tag.py +3 -5
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/undo.py +1 -3
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/update.py +12 -2
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/secret_scan.py +18 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/worktree.py +65 -4
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/install.sh +38 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/pyproject.toml +1 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/branches.json +7 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/conflicts.json +12 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/diff.json +7 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/log.json +8 -0
- gitwise_cli-0.34.0/share/schemas/v1/input/pr.json +101 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/setup-agents.json +6 -6
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/show.json +7 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/stash.json +23 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/worktree.json +7 -1
- gitwise_cli-0.34.0/share/schemas/v1/output/audit.json +115 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/branches.json +75 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/clean.json +58 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/commands.json +46 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/commit.json +74 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/conflicts.json +88 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/context.json +58 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/doctor.json +58 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/health.json +118 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/merge.json +91 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/optimize.json +50 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/pick.json +77 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/pr.json +103 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/setup.json +68 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/snapshot.json +62 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/stash.json +101 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/suggest.json +80 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/summarize.json +41 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/sync.json +58 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/tag.json +81 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/undo.json +74 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/update.json +71 -0
- gitwise_cli-0.34.0/share/schemas/v1/output/worktree.json +95 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_branches.py +8 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_clean.py +15 -0
- gitwise_cli-0.34.0/tests/test_commands.py +38 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_commit.py +44 -2
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_conflicts.py +36 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_diff.py +24 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_git.py +78 -4
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_log.py +8 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_main.py +19 -14
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_pr.py +77 -9
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_secret_scan.py +12 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_show.py +19 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_stash.py +18 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_status.py +1 -1
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_worktree.py +18 -0
- gitwise_cli-0.33.1/share/schemas/v1/input/pr.json +0 -51
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/.gitignore +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/LICENSE +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/README.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/bin/gitwise +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/bin/gw +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_cli_completions.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_cli_setup_agents.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_paths.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/_runtime_config.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/design.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/doctor.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/i18n.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/py.typed +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/schema.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/__init__.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/__init__.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/aider.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/base.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/codex.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/continue_adapter.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/cursor.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/opencode.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/adapters/pi.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/exec.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/format.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/plan.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/plan_gitfiles.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/plan_skills.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/__init__.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/aider.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/base.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/claude.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/codex.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/continue_adapter.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/cursor.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/opencode.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/providers/pi.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/state.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/setup_agents/types.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/__init__.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/git_output.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/in_progress.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/json_envelope.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/parsing.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/gitwise/utils/types.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/agents/skills/git-audit/SKILL.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/agents/skills/git-clean/SKILL.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/agents/skills/git-optimize/SKILL.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/aider/CONVENTIONS.md.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/aider/aider.conf.yml.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/claude/CLAUDE.md.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/claude/rules/gitwise.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/claude/settings.json.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/claude/skills/git-audit/SKILL.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/claude/skills/git-clean/SKILL.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/claude/skills/git-optimize/SKILL.md +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/codex/agents/gitwise.toml.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/continue/rules/gitwise.md.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/cursor/rules/gitwise.mdc.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/git-config-modern.txt +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/hooks/commit-msg +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/hooks/pre-commit +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/opencode/agents/gitwise.md.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/pi/skills/gitwise.md.template +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/audit.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/clean.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/commands.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/commit.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/completions.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/context.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/doctor.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/health.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/merge.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/optimize.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/pick.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/schema.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/setup.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/snapshot.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/status.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/suggest.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/summarize.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/sync.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/tag.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/undo.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/input/update.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/output/diff.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/output/log.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/output/setup-agents.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/share/schemas/v1/output/status.json +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/__init__.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/conftest.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_adapters.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_audit.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_context.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_design.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_doctor.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_edge_cases.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_envelope_contract.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_git_output_utils.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_health.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_i18n.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_in_progress.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_json_envelope_utils.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_md_links_script.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_merge.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_optimize.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_output.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_parsing_utils.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_pick.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_roadmap_baseline_script.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_sa_plan.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_sa_unit.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_schema_catalog.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_setup.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_setup_agents.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_snapshot.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_suggest.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_summarize.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_sync.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_sync_changelog_es_script.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_tag.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_types.py +0 -0
- {gitwise_cli-0.33.1 → gitwise_cli-0.34.0}/tests/test_undo.py +0 -0
|
@@ -3,6 +3,53 @@
|
|
|
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
|
+
|
|
6
53
|
## v0.33.1 (2026-06-23)
|
|
7
54
|
|
|
8
55
|
### Fix
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitwise-cli
|
|
3
|
-
Version: 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
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
"""CLI entry point
|
|
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 (
|
|
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
|
-
|
|
94
|
-
"
|
|
95
|
-
"
|
|
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":
|
|
45
|
-
"v_compat":
|
|
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,
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
71
|
-
"""Build
|
|
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
|
-
|
|
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)
|
|
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(
|
|
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
|
|
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
|