gabriel / muse public
feat BREAKING task/version-tags-phase0-label-rename #3 / 7
AI Agent gabriel · 20 days ago · Jun 29, 2026 · Diff

feat: Phase 3 — version tag push/pull integration (VT_26–VT_33)

- muse tag push <remote> <tag> [--force] sends a version tag to a remote - muse push --tags / push.tags config auto-pushes all local version tags - muse pull fetches version tags from the remote (best-effort, non-fatal) - transport: push_version_tags() and fetch_version_tags() added to protocol - config: [push] section with push.tags boolean; round-trips through TOML - 21 new tests (VT_26–VT_33) — all passing, zero regressions

sha256:6091fde5cedc3f330c9ab8fb814009bf896bc607750eeb7c2e65f77dbdf715d0 sha
+70 ~23 symbols
sha256:bf660b9b0489e081ec39445adb092510ca033c71f8b9d1d3fb07a32f8045eb81 snapshot
+70
symbols added
~23
symbols modified
0
dead code introduced
Semantic Changes 93 symbols
~ tests/test_cmd_version_tag_push.py .py 52 symbols added
+ TestVT26TagPushSubcommand class class TestVT26TagPushSubcommand L135–209
+ test_tag_push_calls_transport method method test_tag_push_calls_transport L193–209
+ test_tag_push_exits_zero method method test_tag_push_exits_zero L138–151
+ test_tag_push_json_status_pushed method method test_tag_push_json_status_pushed L153–168
+ test_tag_push_unknown_remote_exits_one method method test_tag_push_unknown_remote_exits_one L170–178
+ test_tag_push_unknown_tag_exits_one method method test_tag_push_unknown_tag_exits_one L180–191
+ TestVT27AlreadyCurrent class class TestVT27AlreadyCurrent L216–250
+ test_already_current_exits_zero method method test_already_current_exits_zero L237–250
+ test_already_current_when_remote_has_tag method method test_already_current_when_remote_has_tag L219–235
+ TestVT28ForceFlag class class TestVT28ForceFlag L257–310
+ test_conflict_without_force_exits_one method method test_conflict_without_force_exits_one L292–310
+ test_force_flag_accepted method method test_force_flag_accepted L260–273
+ test_force_flag_passed_to_transport method method test_force_flag_passed_to_transport L275–290
+ TestVT29PushWithTags class class TestVT29PushWithTags L317–382
+ test_push_with_tags_calls_push_version_tags method method test_push_with_tags_calls_push_version_tags L364–382
+ test_push_with_tags_json_has_tags_pushed method method test_push_with_tags_json_has_tags_pushed L320–340
+ test_push_with_tags_json_has_tags_skipped method method test_push_with_tags_json_has_tags_skipped L342–362
+ TestVT30NoPushWithoutFlag class class TestVT30NoPushWithoutFlag L389–429
+ test_push_without_tags_does_not_call_push_version_tags method method test_push_without_tags_does_not_call_push_version_tags L392–409
+ test_push_without_tags_json_no_tags_pushed_key method method test_push_without_tags_json_no_tags_pushed_key L411–429
+ TestVT31ConfigPushTags class class TestVT31ConfigPushTags L436–479
+ test_config_set_push_tags_exits_zero method method test_config_set_push_tags_exits_zero L439–444
+ test_config_set_push_tags_persisted method method test_config_set_push_tags_persisted L446–454
+ test_push_with_push_tags_true_auto_pushes_tags method method test_push_with_push_tags_true_auto_pushes_tags L456–479
+ TestVT32PullFetchesTags class class TestVT32PullFetchesTags L486–576
+ test_pull_version_tags_transport_called method method test_pull_version_tags_transport_called L543–576
+ test_pull_with_tags_stores_version_tags method method test_pull_with_tags_stores_version_tags L489–541
+ TestVT33Integration class class TestVT33Integration L583–659
+ test_push_then_pull_stores_tags_locally method method test_push_then_pull_stores_tags_locally L586–659
+ _add_version_tag function function _add_version_tag L92–106
+ _env function function _env L36–37
+ _init_repo function function _init_repo L40–61
+ _make_commit function function _make_commit L64–89
+ _mock_push_transport function function _mock_push_transport L109–128
+ cli variable variable cli L28–28
+ CliRunner import import CliRunner L26–26
+ MagicMock import import MagicMock L17–17
+ VersionTagRecord import import VersionTagRecord L24–24
+ __version__ import import __version__ L21–21
+ annotations import import annotations L12–12
+ compute_version_tag_id import import compute_version_tag_id L24–24
+ datetime import import datetime L14–14
+ fake_id import import fake_id L22–22
+ json import import json L15–15
+ muse_dir import import muse_dir L23–23
+ parse_semver import import parse_semver L25–25
+ patch import import patch L17–17
+ pathlib import import pathlib L16–16
+ pytest import import pytest L19–19
+ ref_path import import ref_path L23–23
+ write_version_tag import import write_version_tag L24–24
+ runner variable variable runner L29–29
~ muse/cli/commands/pull.py .py 4 symbols added, 1 symbol modified
+ VersionTagRecord import import VersionTagRecord L49–49
+ parse_semver import import parse_semver L54–54
+ read_version_tag import import read_version_tag L49–49
+ write_version_tag import import write_version_tag L49–49
~ run
~ muse/cli/commands/push.py .py 3 symbols added, 9 symbols modified
+ _PushWithTagsJson class class _PushWithTagsJson L184–188
+ get_config_value import import get_config_value L68–68
+ list_version_tags import import list_version_tags L78–78
~ run
~ muse/cli/commands/tag.py .py 6 symbols added, 2 symbols modified
+ _TagPushJson class class _TagPushJson L167–171
+ TransportError import import TransportError L95–95
+ get_remote import import get_remote L93–93
+ get_signing_identity import import get_signing_identity L93–93
+ make_transport import import make_transport L95–95
+ run_push function function run_push L603–710
~ muse/cli/config.py .py 1 symbol added, 6 symbols modified
~ muse/core/transport.py .py 4 symbols added, 2 symbols modified
+ fetch_version_tags method method fetch_version_tags L1069–1086
+ push_version_tags method method push_version_tags L1047–1067
+ fetch_version_tags method method fetch_version_tags L467–480
+ push_version_tags method method push_version_tags L443–465

0 comments

No comments yet. Be the first to start the discussion.

To add a comment, use the Muse CLI: muse hub commit comment sha256:6091fde5cedc3f330c9ab8fb814009bf896bc607750eeb7c2e65f77dbdf715d0 --body "your comment"