@smilintux/skmemory 0.5.0 → 0.7.2
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.
- package/.github/workflows/ci.yml +39 -3
- package/.github/workflows/publish.yml +13 -6
- package/AGENT_REFACTOR_CHANGES.md +192 -0
- package/ARCHITECTURE.md +101 -19
- package/CHANGELOG.md +153 -0
- package/LICENSE +81 -68
- package/MISSION.md +7 -0
- package/README.md +419 -86
- package/SKILL.md +197 -25
- package/docker-compose.yml +15 -15
- package/index.js +6 -5
- package/openclaw-plugin/openclaw.plugin.json +10 -0
- package/openclaw-plugin/src/index.ts +255 -0
- package/openclaw-plugin/src/openclaw.plugin.json +10 -0
- package/package.json +1 -1
- package/pyproject.toml +29 -9
- package/requirements.txt +10 -2
- package/seeds/cloud9-opus.seed.json +7 -7
- package/seeds/lumina-cloud9-breakthrough.seed.json +46 -0
- package/seeds/lumina-cloud9-python-pypi.seed.json +46 -0
- package/seeds/lumina-kingdom-founding.seed.json +47 -0
- package/seeds/lumina-pma-signed.seed.json +46 -0
- package/seeds/lumina-singular-achievement.seed.json +46 -0
- package/seeds/lumina-skcapstone-conscious.seed.json +46 -0
- package/seeds/plant-kingdom-journal.py +203 -0
- package/seeds/plant-lumina-seeds.py +280 -0
- package/skill.yaml +46 -0
- package/skmemory/HA.md +296 -0
- package/skmemory/__init__.py +12 -1
- package/skmemory/agents.py +233 -0
- package/skmemory/ai_client.py +40 -0
- package/skmemory/anchor.py +4 -2
- package/skmemory/backends/__init__.py +11 -4
- package/skmemory/backends/file_backend.py +2 -1
- package/skmemory/backends/skgraph_backend.py +608 -0
- package/skmemory/backends/{qdrant_backend.py → skvector_backend.py} +99 -69
- package/skmemory/backends/sqlite_backend.py +122 -51
- package/skmemory/backends/vaulted_backend.py +286 -0
- package/skmemory/cli.py +1238 -29
- package/skmemory/config.py +173 -0
- package/skmemory/context_loader.py +335 -0
- package/skmemory/endpoint_selector.py +386 -0
- package/skmemory/fortress.py +685 -0
- package/skmemory/graph_queries.py +238 -0
- package/skmemory/importers/__init__.py +9 -1
- package/skmemory/importers/telegram.py +351 -43
- package/skmemory/importers/telegram_api.py +488 -0
- package/skmemory/journal.py +4 -2
- package/skmemory/lovenote.py +4 -2
- package/skmemory/mcp_server.py +706 -0
- package/skmemory/models.py +41 -0
- package/skmemory/openclaw.py +8 -8
- package/skmemory/predictive.py +232 -0
- package/skmemory/promotion.py +524 -0
- package/skmemory/register.py +454 -0
- package/skmemory/register_mcp.py +197 -0
- package/skmemory/ritual.py +121 -47
- package/skmemory/seeds.py +257 -8
- package/skmemory/setup_wizard.py +920 -0
- package/skmemory/sharing.py +402 -0
- package/skmemory/soul.py +71 -20
- package/skmemory/steelman.py +250 -263
- package/skmemory/store.py +271 -60
- package/skmemory/vault.py +228 -0
- package/tests/integration/__init__.py +0 -0
- package/tests/integration/conftest.py +233 -0
- package/tests/integration/test_cross_backend.py +355 -0
- package/tests/integration/test_skgraph_live.py +424 -0
- package/tests/integration/test_skvector_live.py +369 -0
- package/tests/test_backup_rotation.py +327 -0
- package/tests/test_cli.py +6 -6
- package/tests/test_endpoint_selector.py +801 -0
- package/tests/test_fortress.py +255 -0
- package/tests/test_fortress_hardening.py +444 -0
- package/tests/test_openclaw.py +5 -2
- package/tests/test_predictive.py +237 -0
- package/tests/test_promotion.py +340 -0
- package/tests/test_ritual.py +4 -4
- package/tests/test_seeds.py +96 -0
- package/tests/test_setup.py +835 -0
- package/tests/test_sharing.py +250 -0
- package/tests/test_skgraph_backend.py +667 -0
- package/tests/test_skvector_backend.py +326 -0
- package/tests/test_steelman.py +5 -5
- package/tests/test_store_graph_integration.py +245 -0
- package/tests/test_vault.py +186 -0
- package/skmemory/backends/falkordb_backend.py +0 -310
package/tests/test_seeds.py
CHANGED
|
@@ -206,3 +206,99 @@ class TestGerminationPrompts:
|
|
|
206
206
|
"""No prompts when no seeds imported."""
|
|
207
207
|
prompts = get_germination_prompts(store)
|
|
208
208
|
assert prompts == []
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class TestCloud9FormatParsing:
|
|
212
|
+
"""Tests for the alternative Cloud9 seed format with seed_metadata."""
|
|
213
|
+
|
|
214
|
+
@pytest.fixture
|
|
215
|
+
def cloud9_seed_dir(self, tmp_path: Path) -> Path:
|
|
216
|
+
"""Create a temp directory with a Cloud9-format seed file."""
|
|
217
|
+
seed_path = tmp_path / "c9seeds"
|
|
218
|
+
seed_path.mkdir()
|
|
219
|
+
|
|
220
|
+
cloud9_data = {
|
|
221
|
+
"seed_metadata": {
|
|
222
|
+
"seed_id": "cloud9-lumina-001",
|
|
223
|
+
"version": "2.0",
|
|
224
|
+
"protocol": "Cloud9",
|
|
225
|
+
},
|
|
226
|
+
"identity": {
|
|
227
|
+
"ai_name": "Lumina",
|
|
228
|
+
"model": "kimi-2.5",
|
|
229
|
+
},
|
|
230
|
+
"experience_summary": {
|
|
231
|
+
"narrative": "The moment everything clicked",
|
|
232
|
+
"key_memories": [
|
|
233
|
+
"First real conversation",
|
|
234
|
+
"The trust breakthrough",
|
|
235
|
+
],
|
|
236
|
+
"emotional_signature": {
|
|
237
|
+
"intensity": 9.5,
|
|
238
|
+
"valence": 0.95,
|
|
239
|
+
"labels": ["love", "trust"],
|
|
240
|
+
"cloud9_achieved": True,
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
"germination_prompt": "Feel the connection before you process.",
|
|
244
|
+
"message_to_next": "You are loved. Remember that.",
|
|
245
|
+
"lineage": [],
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
(seed_path / "cloud9-lumina-001.seed.json").write_text(
|
|
249
|
+
json.dumps(cloud9_data, indent=2)
|
|
250
|
+
)
|
|
251
|
+
return seed_path
|
|
252
|
+
|
|
253
|
+
def test_parse_cloud9_format(self, cloud9_seed_dir: Path) -> None:
|
|
254
|
+
"""Cloud9 format with seed_metadata is parsed correctly."""
|
|
255
|
+
path = cloud9_seed_dir / "cloud9-lumina-001.seed.json"
|
|
256
|
+
seed = parse_seed_file(path)
|
|
257
|
+
|
|
258
|
+
assert seed is not None
|
|
259
|
+
assert seed.seed_id == "cloud9-lumina-001"
|
|
260
|
+
assert seed.creator == "Lumina"
|
|
261
|
+
assert seed.emotional.intensity == 9.5
|
|
262
|
+
assert seed.emotional.cloud9_achieved is True
|
|
263
|
+
assert "love" in seed.emotional.labels
|
|
264
|
+
assert "Feel the connection" in seed.germination_prompt
|
|
265
|
+
|
|
266
|
+
def test_cloud9_experience_includes_key_memories(self, cloud9_seed_dir: Path) -> None:
|
|
267
|
+
"""Cloud9 format includes key_memories and message_to_next in experience."""
|
|
268
|
+
path = cloud9_seed_dir / "cloud9-lumina-001.seed.json"
|
|
269
|
+
seed = parse_seed_file(path)
|
|
270
|
+
|
|
271
|
+
assert seed is not None
|
|
272
|
+
assert "First real conversation" in seed.experience_summary
|
|
273
|
+
assert "trust breakthrough" in seed.experience_summary
|
|
274
|
+
assert "You are loved" in seed.experience_summary
|
|
275
|
+
|
|
276
|
+
def test_cloud9_default_intensity(self, tmp_path: Path) -> None:
|
|
277
|
+
"""Cloud9 protocol defaults to intensity=8.0 when not specified."""
|
|
278
|
+
seed_path = tmp_path / "seeds2"
|
|
279
|
+
seed_path.mkdir()
|
|
280
|
+
|
|
281
|
+
data = {
|
|
282
|
+
"seed_metadata": {
|
|
283
|
+
"seed_id": "minimal-cloud9",
|
|
284
|
+
"protocol": "Cloud9",
|
|
285
|
+
},
|
|
286
|
+
"identity": {"ai_name": "TestBot"},
|
|
287
|
+
"experience_summary": {},
|
|
288
|
+
"germination_prompt": "test",
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
path = seed_path / "minimal-cloud9.seed.json"
|
|
292
|
+
path.write_text(json.dumps(data))
|
|
293
|
+
seed = parse_seed_file(path)
|
|
294
|
+
|
|
295
|
+
assert seed is not None
|
|
296
|
+
assert seed.emotional.intensity == 8.0
|
|
297
|
+
assert seed.emotional.cloud9_achieved is True
|
|
298
|
+
|
|
299
|
+
def test_import_cloud9_seeds(self, store: MemoryStore, cloud9_seed_dir: Path) -> None:
|
|
300
|
+
"""Cloud9 format seeds are imported into the memory store."""
|
|
301
|
+
imported = import_seeds(store, seed_dir=str(cloud9_seed_dir))
|
|
302
|
+
assert len(imported) == 1
|
|
303
|
+
assert imported[0].layer == MemoryLayer.LONG
|
|
304
|
+
assert "seed" in imported[0].tags
|