gabriel / muse public
feat patch store task/phase3-tags-releases-json #1 / 1
AI Agent gabriel · 117 days ago · May 21, 2026 · Diff

feat(store): Phase 3 — tags and releases stored as plain JSON

- tag_path() and release_path() now return .json paths - write_tag() and write_release() use new _write_json_atomic() helper (same mkstemp+fsync+rename crash safety as _write_msgpack_atomic) - get_all_tags(), get_tags_for_commit(): glob */* (both extensions), silently migrate .msgpack → .json on first read, delete old file - list_releases(), read_release(): same upgrade path for releases - gc._collect_reachable_commits(): reads .json tags (with .msgpack fallback) - 20 TDD tests added in test_phase3_tags_releases_json.py

sha256:13593414ec8a77e9d7143c16a14a15c0dccf52dd4b9e8f450119d09a1e88f942 sha
+63 ~9 symbols
sha256:26f4141455dd0c3d536c35397ef1fa69cce6a8dcdd229741dbb1a299ea135bfa snapshot
+63
symbols added
~9
symbols modified
0
dead code introduced
Semantic Changes 72 symbols
+ TestGcReadsJsonTags class class TestGcReadsJsonTags L361–375
+ test_gc_includes_json_tag_commit_id_as_tip method method test_gc_includes_json_tag_commit_id_as_tip L362–375
+ TestLegacyReleaseMsgpackUpgrade class class TestLegacyReleaseMsgpackUpgrade L277–318
+ test_legacy_release_migrated_to_json_on_read method method test_legacy_release_migrated_to_json_on_read L298–307
+ test_legacy_release_msgpack_removed_after_migration method method test_legacy_release_msgpack_removed_after_migration L309–318
+ test_legacy_release_readable_via_list_releases method method test_legacy_release_readable_via_list_releases L288–296
+ test_legacy_release_readable_via_read_release method method test_legacy_release_readable_via_read_release L278–286
+ TestLegacyTagMsgpackUpgrade class class TestLegacyTagMsgpackUpgrade L228–270
+ test_legacy_msgpack_file_removed_after_migration method method test_legacy_msgpack_file_removed_after_migration L261–270
+ test_legacy_tag_migrated_to_json_on_read method method test_legacy_tag_migrated_to_json_on_read L250–259
+ test_legacy_tag_readable_via_get_all_tags method method test_legacy_tag_readable_via_get_all_tags L229–238
+ test_legacy_tag_readable_via_get_tags_for_commit method method test_legacy_tag_readable_via_get_tags_for_commit L240–248
+ TestMixedFormatListing class class TestMixedFormatListing L325–354
+ test_list_releases_mixed_formats method method test_list_releases_mixed_formats L341–354
+ test_list_tags_mixed_formats method method test_list_tags_mixed_formats L326–339
+ TestPathExtensions class class TestPathExtensions L117–139
+ test_release_path_has_json_extension method method test_release_path_has_json_extension L124–128
+ test_tag_path_directory_structure_unchanged method method test_tag_path_directory_structure_unchanged L130–139
+ test_tag_path_has_json_extension method method test_tag_path_has_json_extension L118–122
+ TestWriteReleaseJson class class TestWriteReleaseJson L190–221
+ test_write_release_produces_json_file method method test_write_release_produces_json_file L191–200
+ test_write_release_roundtrip_via_list method method test_write_release_roundtrip_via_list L213–221
+ test_write_release_roundtrip_via_read_release method method test_write_release_roundtrip_via_read_release L202–211
+ TestWriteTagJson class class TestWriteTagJson L146–183
+ test_write_tag_not_msgpack method method test_write_tag_not_msgpack L158–171
+ test_write_tag_produces_json_file method method test_write_tag_produces_json_file L147–156
+ test_write_tag_roundtrip method method test_write_tag_roundtrip L173–183
+ _COMMIT_A variable variable _COMMIT_A L44–44
+ _COMMIT_B variable variable _COMMIT_B L45–45
+ _REPO_ID variable variable _REPO_ID L43–43
+ _SEMVER variable variable _SEMVER L48–48
+ _SNAPSHOT_ID variable variable _SNAPSHOT_ID L46–46
+ _legacy_release_path function function _legacy_release_path L92–94
+ _legacy_tag_path function function _legacy_tag_path L87–89
+ _make_release function function _make_release L71–84
+ _make_repo function function _make_repo L55–58
+ _make_tag function function _make_tag L61–68
+ _write_legacy_release function function _write_legacy_release L105–110
+ _write_legacy_tag function function _write_legacy_tag L97–102
+ ReleaseRecord import import ReleaseRecord L22–22
+ TagRecord import import TagRecord L22–22
+ annotations import import annotations L12–12
+ compute_release_id import import compute_release_id L22–22
+ compute_tag_id import import compute_tag_id L22–22
+ get_all_tags import import get_all_tags L22–22
+ get_tags_for_commit import import get_tags_for_commit L22–22
+ hash_blob import import hash_blob L20–20
+ json import import json L14–14
+ list_releases import import list_releases L22–22
+ long_id import import long_id L36–36
+ msgpack import import msgpack L17–17
+ pathlib import import pathlib L15–15
+ pytest import import pytest L18–18
+ read_release import import read_release L22–22
+ release_path import import release_path L22–22
+ split_id import import split_id L36–36
+ tag_path import import tag_path L22–22
+ tags_dir import import tags_dir L21–21
+ write_release import import write_release L22–22
+ write_tag import import write_tag L22–22
~ muse/core/gc.py .py 1 symbol modified
~ muse/core/store.py .py 3 symbols added, 8 symbols modified
+ _read_release_or_migrate function function _read_release_or_migrate L2371–2387
+ _read_tag_or_migrate function function _read_tag_or_migrate L2353–2369
+ _write_json_atomic function function _write_json_atomic L665–698
← Older Oldest on task/phase3-tags-releases-json
All commits
Newer → Latest on task/phase3-tags-releases-json

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:13593414ec8a77e9d7143c16a14a15c0dccf52dd4b9e8f450119d09a1e88f942 --body "your comment"