memory-seed 2.2.3__tar.gz → 2.3.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.
- {memory_seed-2.2.3 → memory_seed-2.3.0}/PKG-INFO +3 -3
- {memory_seed-2.2.3 → memory_seed-2.3.0}/README.md +2 -2
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/core.py +19 -2
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/agent-rules.md +3 -3
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/hooks/session-log-check.py +6 -5
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/project-bootstrap.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/code_search.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/data_architecture.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/index.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/local_compilation.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/memory_consolidation.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/memory_doctor.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/release_publishing.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/skills/security_triage.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/AGENTS.md +3 -2
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/CLAUDE.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/GEMINI.md +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed.egg-info/PKG-INFO +3 -3
- {memory_seed-2.2.3 → memory_seed-2.3.0}/pyproject.toml +1 -1
- {memory_seed-2.2.3 → memory_seed-2.3.0}/tests/test_memory_seed.py +39 -9
- {memory_seed-2.2.3 → memory_seed-2.3.0}/LICENSE +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/__init__.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/cli.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/mcp_server.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/mcp_validate.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/archive/.gitkeep +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/hooks/memory-retrieval-check.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/sessions/.gitkeep +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/semantic_cache.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed.egg-info/SOURCES.txt +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed.egg-info/dependency_links.txt +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed.egg-info/entry_points.txt +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed.egg-info/requires.txt +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed.egg-info/top_level.txt +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/setup.cfg +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/tests/test_mcp_server.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/tests/test_mcp_validation.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/tests/test_semantic_cache.py +0 -0
- {memory_seed-2.2.3 → memory_seed-2.3.0}/tests/test_session_schema.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memory-seed
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Portable local memory seed for file-reading AI coding agents
|
|
5
5
|
Author: Jean Nathan Tshibuyi
|
|
6
6
|
License: MIT
|
|
@@ -200,7 +200,7 @@ GEMINI.md
|
|
|
200
200
|
|
|
201
201
|
## Current Version
|
|
202
202
|
|
|
203
|
-
The current reusable control-plane version is `2.
|
|
203
|
+
The current reusable control-plane version is `2.3`.
|
|
204
204
|
|
|
205
205
|
Legacy `.AGENTS/` projects remain supported as a fallback during migration.
|
|
206
206
|
|
|
@@ -304,7 +304,7 @@ When `--force` creates backups, Memory Seed adds `.memory-seed/backups/` to the
|
|
|
304
304
|
|
|
305
305
|
The `update` command refreshes routing files, reusable runtime procedure files, and generic skill templates by version, sourcing them **from the installed package** rather than from PyPI — upgrade the package first to get newer templates (see [Updating](#updating)). Before replacing stale reusable control-plane files, it backs them up under `.memory-seed/backups/<timestamp>/` and archives their old version under `.memory-seed/archive/<old-version>/` or `.memory-seed/archive/unknown-<timestamp>/` when the old version is missing. Generated local memory files such as `index.md`, `policy.md`, and sessions are preserved.
|
|
306
306
|
|
|
307
|
-
Use `update --dry-run` to list the reusable control-plane targets without writing files. Current behavior is conservative but broad: dry-run lists bundled seed paths rather than calculating which files are missing or version-mismatched. The real `update` command skips files
|
|
307
|
+
Use `update --dry-run` to list the reusable control-plane targets without writing files. Current behavior is conservative but broad: dry-run lists bundled seed paths rather than calculating which files are missing or version-mismatched. The real `update` command skips files already at the current `memory-system-version` or newer — so a stale installed tool never downgrades a project — and preserves existing `.memory-seed/` runtime files.
|
|
308
308
|
|
|
309
309
|
The `compact` command summarises recent session activity from the nearest runtime so an agent can identify durable facts to promote into `index.md`, `policy.md`, or skills:
|
|
310
310
|
|
|
@@ -179,7 +179,7 @@ GEMINI.md
|
|
|
179
179
|
|
|
180
180
|
## Current Version
|
|
181
181
|
|
|
182
|
-
The current reusable control-plane version is `2.
|
|
182
|
+
The current reusable control-plane version is `2.3`.
|
|
183
183
|
|
|
184
184
|
Legacy `.AGENTS/` projects remain supported as a fallback during migration.
|
|
185
185
|
|
|
@@ -283,7 +283,7 @@ When `--force` creates backups, Memory Seed adds `.memory-seed/backups/` to the
|
|
|
283
283
|
|
|
284
284
|
The `update` command refreshes routing files, reusable runtime procedure files, and generic skill templates by version, sourcing them **from the installed package** rather than from PyPI — upgrade the package first to get newer templates (see [Updating](#updating)). Before replacing stale reusable control-plane files, it backs them up under `.memory-seed/backups/<timestamp>/` and archives their old version under `.memory-seed/archive/<old-version>/` or `.memory-seed/archive/unknown-<timestamp>/` when the old version is missing. Generated local memory files such as `index.md`, `policy.md`, and sessions are preserved.
|
|
285
285
|
|
|
286
|
-
Use `update --dry-run` to list the reusable control-plane targets without writing files. Current behavior is conservative but broad: dry-run lists bundled seed paths rather than calculating which files are missing or version-mismatched. The real `update` command skips files
|
|
286
|
+
Use `update --dry-run` to list the reusable control-plane targets without writing files. Current behavior is conservative but broad: dry-run lists bundled seed paths rather than calculating which files are missing or version-mismatched. The real `update` command skips files already at the current `memory-system-version` or newer — so a stale installed tool never downgrades a project — and preserves existing `.memory-seed/` runtime files.
|
|
287
287
|
|
|
288
288
|
The `compact` command summarises recent session activity from the nearest runtime so an agent can identify durable facts to promote into `index.md`, `policy.md`, or skills:
|
|
289
289
|
|
|
@@ -10,7 +10,7 @@ from pathlib import Path
|
|
|
10
10
|
|
|
11
11
|
PACKAGE_ROOT = Path(__file__).resolve().parent
|
|
12
12
|
SEED_ROOT = PACKAGE_ROOT / "seed"
|
|
13
|
-
VERSION = "2.
|
|
13
|
+
VERSION = "2.3"
|
|
14
14
|
MEMORY_DIR_NAME = ".memory-seed"
|
|
15
15
|
LEGACY_MEMORY_DIR_NAME = ".AGENTS"
|
|
16
16
|
BACKUP_IGNORE_ENTRY = ".memory-seed/backups/"
|
|
@@ -517,7 +517,9 @@ def update_project(cwd: str | Path = ".", dry_run: bool = False) -> InitResult:
|
|
|
517
517
|
if _is_runtime_local_file(seed_file.destination) and destination.exists():
|
|
518
518
|
continue
|
|
519
519
|
|
|
520
|
-
if destination.exists() and
|
|
520
|
+
if destination.exists() and _version_at_least(
|
|
521
|
+
_read_memory_system_version(destination), VERSION
|
|
522
|
+
):
|
|
521
523
|
continue
|
|
522
524
|
|
|
523
525
|
if destination.exists():
|
|
@@ -677,6 +679,21 @@ def _read_memory_system_version(path: Path) -> str | None:
|
|
|
677
679
|
return match.group(1)
|
|
678
680
|
|
|
679
681
|
|
|
682
|
+
def _version_tuple(version: str | None) -> tuple[int, ...]:
|
|
683
|
+
"""Dotted version -> int tuple. Missing/unparseable -> (-1,) so it always
|
|
684
|
+
compares older than any real version and is upgraded forward."""
|
|
685
|
+
if not version:
|
|
686
|
+
return (-1,)
|
|
687
|
+
try:
|
|
688
|
+
return tuple(int(part) for part in version.strip().split("."))
|
|
689
|
+
except ValueError:
|
|
690
|
+
return (-1,)
|
|
691
|
+
|
|
692
|
+
|
|
693
|
+
def _version_at_least(actual: str | None, minimum: str) -> bool:
|
|
694
|
+
return _version_tuple(actual) >= _version_tuple(minimum)
|
|
695
|
+
|
|
696
|
+
|
|
680
697
|
def _is_runtime_local_file(destination: str) -> bool:
|
|
681
698
|
reusable_runtime_files = {
|
|
682
699
|
f"{MEMORY_DIR_NAME}/agent-rules.md",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
memory-system-version: 2.
|
|
2
|
+
memory-system-version: 2.3
|
|
3
3
|
tags:
|
|
4
4
|
- memory-seed
|
|
5
5
|
- agent-rules
|
|
@@ -292,12 +292,12 @@ Deferring or batching session log writes is a discipline failure, not an accepta
|
|
|
292
292
|
The session file is strictly append-only and must stay in ascending time order. To guarantee this without ever reordering:
|
|
293
293
|
|
|
294
294
|
- Append every new entry to the **end** of the day's file. Never insert an entry above an existing one.
|
|
295
|
-
- **
|
|
295
|
+
- **Append each entry at the physical end of the file; never insert above an existing entry.** That is the rule; the mechanism is up to your tools. The common failure is anchor-based edit tools — if you target a line you wrote earlier, a later edit may already sit below it, so the new entry lands mid-file. Avoid it by confirming the *actual* last line immediately before appending (for example, read the file's tail); never reuse an anchor from memory. With a POSIX shell or Python, append mode (`>> file`, `open(f, 'a')`) sidesteps anchors entirely — write UTF-8 (some shells, for example PowerShell `>>`, default to other encodings).
|
|
296
296
|
- The entry heading timestamp is the **actual current clock time** at the moment you write it. Read it from the system clock; never reuse a time from your context, memory, or an earlier message, and never backdate it to when the work happened.
|
|
297
297
|
- Because entries are always appended with the current time, file order, write order, and timestamp order are identical. No manual reordering is ever needed or allowed.
|
|
298
298
|
- If you are recording work that completed earlier in the session (you forgot, or you are catching up), still stamp the heading with the current time. If the original work time matters, state it in the entry body — do not move the entry above newer ones and do not rewrite earlier headings.
|
|
299
299
|
|
|
300
|
-
This is the invariant the "do not rewrite old session entries" rule protects: out-of-order or backdated entries force a human to manually re-sort the log, which is exactly what append-only is meant to prevent.
|
|
300
|
+
This is the invariant the "do not rewrite old session entries" rule protects: out-of-order or backdated entries force a human to manually re-sort the log, which is exactly what append-only is meant to prevent. Confirming the real last line before each append — or using append mode where your environment supports it — makes this invariant mechanical rather than reliant on a remembered anchor.
|
|
301
301
|
|
|
302
302
|
Detailed work logs belong in the nearest active runtime. Add a parent/root summary only when sub-project work changes parent-visible topology, shared design, release behavior, policy inheritance, cross-project dependencies, risks, or active priorities. Do not mirror sub-project logs into root memory.
|
|
303
303
|
|
{memory_seed-2.2.3 → memory_seed-2.3.0}/memory_seed/seed/.memory-seed/hooks/session-log-check.py
RENAMED
|
@@ -56,11 +56,12 @@ if any(stamps[i] < stamps[i - 1] for i in range(1, len(stamps))):
|
|
|
56
56
|
messages.append(
|
|
57
57
|
f"SESSION LOG ORDER WARNING: Entries in "
|
|
58
58
|
f".memory-seed/sessions/{today}.md are not in ascending time "
|
|
59
|
-
f"order. The log is append-only. To repair:
|
|
60
|
-
f"
|
|
61
|
-
f"
|
|
62
|
-
f"
|
|
63
|
-
f"
|
|
59
|
+
f"order. The log is append-only. To repair: move the out-of-order "
|
|
60
|
+
f"entry to the physical end of the file with the current clock "
|
|
61
|
+
f"time; confirm the actual last line before appending rather than "
|
|
62
|
+
f"reusing a remembered anchor (append mode like >> or open(f, 'a') "
|
|
63
|
+
f"avoids the problem where supported). Do not reorder existing "
|
|
64
|
+
f"entries unless the user asks for a repair."
|
|
64
65
|
)
|
|
65
66
|
|
|
66
67
|
if not messages:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
memory-system-version: 2.
|
|
2
|
+
memory-system-version: 2.3
|
|
3
3
|
tags:
|
|
4
4
|
- agent-entry
|
|
5
5
|
- ai-memory
|
|
@@ -46,7 +46,8 @@ When initialized memory files exist, start here:
|
|
|
46
46
|
2. Read the active `.memory-seed/index.md` for topology, active state, and inheritance rules.
|
|
47
47
|
3. Read parent `.memory-seed/policy.md` only when the active index says policy is inherited.
|
|
48
48
|
4. Read the active `.memory-seed/policy.md` for behavioral constraints and local overrides.
|
|
49
|
-
5.
|
|
49
|
+
5. Read `.memory-seed/skills/index.md` as the deterministic skill trigger registry.
|
|
50
|
+
6. Load full files from `.memory-seed/skills/` only when the trigger registry matches the task.
|
|
50
51
|
|
|
51
52
|
Do not read skills preemptively. Skills are lazy-loaded execution runbooks.
|
|
52
53
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: memory-seed
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: Portable local memory seed for file-reading AI coding agents
|
|
5
5
|
Author: Jean Nathan Tshibuyi
|
|
6
6
|
License: MIT
|
|
@@ -200,7 +200,7 @@ GEMINI.md
|
|
|
200
200
|
|
|
201
201
|
## Current Version
|
|
202
202
|
|
|
203
|
-
The current reusable control-plane version is `2.
|
|
203
|
+
The current reusable control-plane version is `2.3`.
|
|
204
204
|
|
|
205
205
|
Legacy `.AGENTS/` projects remain supported as a fallback during migration.
|
|
206
206
|
|
|
@@ -304,7 +304,7 @@ When `--force` creates backups, Memory Seed adds `.memory-seed/backups/` to the
|
|
|
304
304
|
|
|
305
305
|
The `update` command refreshes routing files, reusable runtime procedure files, and generic skill templates by version, sourcing them **from the installed package** rather than from PyPI — upgrade the package first to get newer templates (see [Updating](#updating)). Before replacing stale reusable control-plane files, it backs them up under `.memory-seed/backups/<timestamp>/` and archives their old version under `.memory-seed/archive/<old-version>/` or `.memory-seed/archive/unknown-<timestamp>/` when the old version is missing. Generated local memory files such as `index.md`, `policy.md`, and sessions are preserved.
|
|
306
306
|
|
|
307
|
-
Use `update --dry-run` to list the reusable control-plane targets without writing files. Current behavior is conservative but broad: dry-run lists bundled seed paths rather than calculating which files are missing or version-mismatched. The real `update` command skips files
|
|
307
|
+
Use `update --dry-run` to list the reusable control-plane targets without writing files. Current behavior is conservative but broad: dry-run lists bundled seed paths rather than calculating which files are missing or version-mismatched. The real `update` command skips files already at the current `memory-system-version` or newer — so a stale installed tool never downgrades a project — and preserves existing `.memory-seed/` runtime files.
|
|
308
308
|
|
|
309
309
|
The `compact` command summarises recent session activity from the nearest runtime so an agent can identify durable facts to promote into `index.md`, `policy.md`, or skills:
|
|
310
310
|
|
|
@@ -23,7 +23,17 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
23
23
|
return path
|
|
24
24
|
|
|
25
25
|
def test_version_reads_reusable_control_plane_version(self):
|
|
26
|
-
self.assertEqual(get_version(), "2.
|
|
26
|
+
self.assertEqual(get_version(), "2.3")
|
|
27
|
+
|
|
28
|
+
def test_version_at_least_orders_versions_numerically(self):
|
|
29
|
+
from memory_seed.core import _version_at_least
|
|
30
|
+
|
|
31
|
+
self.assertTrue(_version_at_least("2.2", "2.2")) # equal
|
|
32
|
+
self.assertTrue(_version_at_least("2.3", "2.2")) # newer
|
|
33
|
+
self.assertTrue(_version_at_least("2.10", "2.9")) # multi-digit, not string compare
|
|
34
|
+
self.assertFalse(_version_at_least("2.1", "2.2")) # older
|
|
35
|
+
self.assertFalse(_version_at_least(None, "2.2")) # missing -> treat as older
|
|
36
|
+
self.assertFalse(_version_at_least("garbage", "2.2")) # unparseable -> older
|
|
27
37
|
|
|
28
38
|
def test_init_dry_run_reports_seed_files_without_writing(self):
|
|
29
39
|
cwd = self.make_project()
|
|
@@ -90,7 +100,7 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
90
100
|
self.assertTrue(result.backed_up[0].startswith(".memory-seed/backups/"))
|
|
91
101
|
self.assertEqual((cwd / result.backed_up[0]).read_text(encoding="utf-8"), "existing")
|
|
92
102
|
self.assertIn(
|
|
93
|
-
"memory-system-version: 2.
|
|
103
|
+
"memory-system-version: 2.3",
|
|
94
104
|
(cwd / "AGENTS.md").read_text(encoding="utf-8"),
|
|
95
105
|
)
|
|
96
106
|
self.assertIn(".memory-seed/backups/", (cwd / ".gitignore").read_text(encoding="utf-8"))
|
|
@@ -111,7 +121,7 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
111
121
|
init_project(cwd=cwd)
|
|
112
122
|
gemini = cwd / "GEMINI.md"
|
|
113
123
|
gemini.write_text(
|
|
114
|
-
gemini.read_text(encoding="utf-8").replace("2.
|
|
124
|
+
gemini.read_text(encoding="utf-8").replace("2.3", "1.1"),
|
|
115
125
|
encoding="utf-8",
|
|
116
126
|
)
|
|
117
127
|
(cwd / "CLAUDE.md").unlink()
|
|
@@ -128,7 +138,7 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
128
138
|
)
|
|
129
139
|
self.assertEqual(
|
|
130
140
|
result.version_mismatches,
|
|
131
|
-
[{"file": "GEMINI.md", "expected": "2.
|
|
141
|
+
[{"file": "GEMINI.md", "expected": "2.3", "actual": "1.1"}],
|
|
132
142
|
)
|
|
133
143
|
|
|
134
144
|
def test_doctor_distinguishes_bootstrap_completeness_from_control_plane_health(self):
|
|
@@ -211,11 +221,11 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
211
221
|
self.assertIn("CLAUDE.md", result.created)
|
|
212
222
|
self.assertTrue(any(path.endswith("/AGENTS.md") for path in result.backed_up))
|
|
213
223
|
self.assertIn(
|
|
214
|
-
"memory-system-version: 2.
|
|
224
|
+
"memory-system-version: 2.3",
|
|
215
225
|
(cwd / "AGENTS.md").read_text(encoding="utf-8"),
|
|
216
226
|
)
|
|
217
227
|
self.assertIn(
|
|
218
|
-
"memory-system-version: 2.
|
|
228
|
+
"memory-system-version: 2.3",
|
|
219
229
|
(cwd / "CLAUDE.md").read_text(encoding="utf-8"),
|
|
220
230
|
)
|
|
221
231
|
self.assertEqual(
|
|
@@ -229,7 +239,7 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
229
239
|
init_project(cwd=cwd)
|
|
230
240
|
agents = cwd / "AGENTS.md"
|
|
231
241
|
agents.write_text(
|
|
232
|
-
agents.read_text(encoding="utf-8").replace("2.
|
|
242
|
+
agents.read_text(encoding="utf-8").replace("2.3", "1.4"),
|
|
233
243
|
encoding="utf-8",
|
|
234
244
|
)
|
|
235
245
|
|
|
@@ -241,6 +251,26 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
241
251
|
self.assertTrue(archived.exists())
|
|
242
252
|
self.assertIn("memory-system-version: 1.4", archived.read_text(encoding="utf-8"))
|
|
243
253
|
|
|
254
|
+
def test_update_does_not_downgrade_newer_control_plane_files(self):
|
|
255
|
+
cwd = self.make_project()
|
|
256
|
+
init_project(cwd=cwd)
|
|
257
|
+
agents = cwd / "AGENTS.md"
|
|
258
|
+
# Simulate a project on a newer control plane than this tool ships.
|
|
259
|
+
agents.write_text(
|
|
260
|
+
agents.read_text(encoding="utf-8").replace(
|
|
261
|
+
f"memory-system-version: {get_version()}",
|
|
262
|
+
"memory-system-version: 9.9",
|
|
263
|
+
),
|
|
264
|
+
encoding="utf-8",
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
result = update_project(cwd=cwd)
|
|
268
|
+
|
|
269
|
+
# The newer file must be left untouched: no overwrite, no archive.
|
|
270
|
+
self.assertIn("memory-system-version: 9.9", agents.read_text(encoding="utf-8"))
|
|
271
|
+
self.assertNotIn("AGENTS.md", result.created)
|
|
272
|
+
self.assertFalse(any("AGENTS.md" in archived for archived in result.archived))
|
|
273
|
+
|
|
244
274
|
def test_update_archives_unknown_version_control_plane_files_under_timestamped_folder(self):
|
|
245
275
|
cwd = self.make_project()
|
|
246
276
|
init_project(cwd=cwd)
|
|
@@ -313,14 +343,14 @@ class MemorySeedTests(unittest.TestCase):
|
|
|
313
343
|
self.assertTrue(
|
|
314
344
|
any(path.endswith("/.memory-seed/agent-rules.md") for path in result.backed_up)
|
|
315
345
|
)
|
|
316
|
-
self.assertIn("memory-system-version: 2.
|
|
346
|
+
self.assertIn("memory-system-version: 2.3", rules.read_text(encoding="utf-8"))
|
|
317
347
|
|
|
318
348
|
def test_control_plane_files_report_current_version(self):
|
|
319
349
|
for seed_file in SEED_FILES:
|
|
320
350
|
if not seed_file.source.suffix == ".md":
|
|
321
351
|
continue
|
|
322
352
|
content = seed_file.source.read_text(encoding="utf-8")
|
|
323
|
-
self.assertIn("memory-system-version: 2.
|
|
353
|
+
self.assertIn("memory-system-version: 2.3", content, seed_file.destination)
|
|
324
354
|
|
|
325
355
|
def test_seed_files_use_memory_seed_runtime(self):
|
|
326
356
|
destinations = sorted(seed_file.destination for seed_file in SEED_FILES)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|