1- <!-- Last synced: 2026-07-02 -->
1+ <!-- Last synced: 2026-09-08 -->
22English | [ 日本語] ( CHANGELOG.md )
33
44# Changelog
@@ -12,14 +12,56 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
1313## Table of Contents
1414
15- - [ v5.x] ( #590 ---2026-08-26 )
15+ - [ v5.x] ( #5100 ---2026-09-08 )
1616- [ v4.x] ( #410---2025-12-03 )
1717- [ v3.x] ( #330---2025-11-29 )
1818- [ Archive (v2.x and earlier)] ( #archive-v2x-and-earlier )
1919- [ Versioning Rules] ( #versioning-rules )
2020
2121---
2222
23+ ## [ 5.10.0] - 2026-09-08
24+
25+ Moves ` /digest ` Pattern 1 Step 3 (appending to ` source_files ` ) from hand-editing to a script, and pins JSON output line endings to LF.
26+
27+ ### Added
28+
29+ - ** ` interfaces/add_shadow_sources.py ` (` ShadowSourceAdder ` )** — CLI that appends file names to the SGD
30+ ` source_files ` : ` python -m interfaces.add_shadow_sources <level> <filename>... ` . Already-registered
31+ names are skipped (idempotent) and duplicates within one call are added once. When the level
32+ already holds an analysis, the four fields (digest_type / keywords / abstract / impression) are
33+ left alone; in the PLACEHOLDER state (right after a finalize) they are refreshed to placeholder
34+ text sized by the file count — the same ` FileAppender ` behavior as ` update_shadow_for_new_loops ` ,
35+ and Step 7 overwrites them anyway. The append itself delegates to the existing
36+ ` ShadowGrandDigestManager.add_files_to_shadow ` ; the CLI is a thin wrapper. Empty names and names
37+ containing a path separator raise ` EpisodicRAGError `
38+ - ` commands/digest.md ` Pattern 1 Step 3 now calls this CLI instead of the Edit tool. The same document
39+ warned in Step 7 that direct edits of the SGD are error-prone while Step 3 still prescribed one;
40+ that contradiction is gone
41+
42+ ### Fixed
43+
44+ - ** ` save_json ` now writes LF only** — ` Path.open("w") ` lacked ` newline="\n" ` , so Windows text mode
45+ turned every ` \n ` into ` \r\n ` . ShadowGrandDigest, Provisional and last_digest_times were all written
46+ as CRLF, and the memory repository warned ` CRLF will be replaced by LF ` on every touch (history was
47+ intact because ` .gitattributes ` ` eol=lf ` normalizes at commit; only the working copy was CRLF).
48+ Two regression tests: no ` \r\n ` in the output bytes (red only on Windows) and ` Path.open ` being
49+ called with ` newline="\n" ` (catches regressions on Linux CI too)
50+ - ** ` index_writer.apply_index ` and ` tools/check_footer.fix_footer ` pinned to LF the same way** — the
51+ former rewrites auto-memory's MEMORY.md (untracked by git, so nothing normalizes it and CRLF would
52+ stick), the latter is the footer fixer behind ` /doc-check ` . Each got the same pair of regression
53+ tests as ` save_json ` (` apply_index ` previously had none)
54+
55+ ### Notes
56+
57+ - The installed (Daily Use) copy keeps the old code until the plugin is updated; ` /digest ` Step 3
58+ switches to the CLI path after that
59+
60+ ### Verification
61+
62+ ruff 0 / ruff format 302 files already formatted / mypy Success (302 files, the same invocation CI uses) /
63+ pytest 2386 passed, 2 skipped (` -m "not slow and not performance" ` )
64+
2365## [ 5.9.0] - 2026-08-26
2466
2567Static checking aligned with the workspace baseline. No behavior change.
0 commit comments