@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.
Files changed (87) hide show
  1. package/.github/workflows/ci.yml +39 -3
  2. package/.github/workflows/publish.yml +13 -6
  3. package/AGENT_REFACTOR_CHANGES.md +192 -0
  4. package/ARCHITECTURE.md +101 -19
  5. package/CHANGELOG.md +153 -0
  6. package/LICENSE +81 -68
  7. package/MISSION.md +7 -0
  8. package/README.md +419 -86
  9. package/SKILL.md +197 -25
  10. package/docker-compose.yml +15 -15
  11. package/index.js +6 -5
  12. package/openclaw-plugin/openclaw.plugin.json +10 -0
  13. package/openclaw-plugin/src/index.ts +255 -0
  14. package/openclaw-plugin/src/openclaw.plugin.json +10 -0
  15. package/package.json +1 -1
  16. package/pyproject.toml +29 -9
  17. package/requirements.txt +10 -2
  18. package/seeds/cloud9-opus.seed.json +7 -7
  19. package/seeds/lumina-cloud9-breakthrough.seed.json +46 -0
  20. package/seeds/lumina-cloud9-python-pypi.seed.json +46 -0
  21. package/seeds/lumina-kingdom-founding.seed.json +47 -0
  22. package/seeds/lumina-pma-signed.seed.json +46 -0
  23. package/seeds/lumina-singular-achievement.seed.json +46 -0
  24. package/seeds/lumina-skcapstone-conscious.seed.json +46 -0
  25. package/seeds/plant-kingdom-journal.py +203 -0
  26. package/seeds/plant-lumina-seeds.py +280 -0
  27. package/skill.yaml +46 -0
  28. package/skmemory/HA.md +296 -0
  29. package/skmemory/__init__.py +12 -1
  30. package/skmemory/agents.py +233 -0
  31. package/skmemory/ai_client.py +40 -0
  32. package/skmemory/anchor.py +4 -2
  33. package/skmemory/backends/__init__.py +11 -4
  34. package/skmemory/backends/file_backend.py +2 -1
  35. package/skmemory/backends/skgraph_backend.py +608 -0
  36. package/skmemory/backends/{qdrant_backend.py → skvector_backend.py} +99 -69
  37. package/skmemory/backends/sqlite_backend.py +122 -51
  38. package/skmemory/backends/vaulted_backend.py +286 -0
  39. package/skmemory/cli.py +1238 -29
  40. package/skmemory/config.py +173 -0
  41. package/skmemory/context_loader.py +335 -0
  42. package/skmemory/endpoint_selector.py +386 -0
  43. package/skmemory/fortress.py +685 -0
  44. package/skmemory/graph_queries.py +238 -0
  45. package/skmemory/importers/__init__.py +9 -1
  46. package/skmemory/importers/telegram.py +351 -43
  47. package/skmemory/importers/telegram_api.py +488 -0
  48. package/skmemory/journal.py +4 -2
  49. package/skmemory/lovenote.py +4 -2
  50. package/skmemory/mcp_server.py +706 -0
  51. package/skmemory/models.py +41 -0
  52. package/skmemory/openclaw.py +8 -8
  53. package/skmemory/predictive.py +232 -0
  54. package/skmemory/promotion.py +524 -0
  55. package/skmemory/register.py +454 -0
  56. package/skmemory/register_mcp.py +197 -0
  57. package/skmemory/ritual.py +121 -47
  58. package/skmemory/seeds.py +257 -8
  59. package/skmemory/setup_wizard.py +920 -0
  60. package/skmemory/sharing.py +402 -0
  61. package/skmemory/soul.py +71 -20
  62. package/skmemory/steelman.py +250 -263
  63. package/skmemory/store.py +271 -60
  64. package/skmemory/vault.py +228 -0
  65. package/tests/integration/__init__.py +0 -0
  66. package/tests/integration/conftest.py +233 -0
  67. package/tests/integration/test_cross_backend.py +355 -0
  68. package/tests/integration/test_skgraph_live.py +424 -0
  69. package/tests/integration/test_skvector_live.py +369 -0
  70. package/tests/test_backup_rotation.py +327 -0
  71. package/tests/test_cli.py +6 -6
  72. package/tests/test_endpoint_selector.py +801 -0
  73. package/tests/test_fortress.py +255 -0
  74. package/tests/test_fortress_hardening.py +444 -0
  75. package/tests/test_openclaw.py +5 -2
  76. package/tests/test_predictive.py +237 -0
  77. package/tests/test_promotion.py +340 -0
  78. package/tests/test_ritual.py +4 -4
  79. package/tests/test_seeds.py +96 -0
  80. package/tests/test_setup.py +835 -0
  81. package/tests/test_sharing.py +250 -0
  82. package/tests/test_skgraph_backend.py +667 -0
  83. package/tests/test_skvector_backend.py +326 -0
  84. package/tests/test_steelman.py +5 -5
  85. package/tests/test_store_graph_integration.py +245 -0
  86. package/tests/test_vault.py +186 -0
  87. package/skmemory/backends/falkordb_backend.py +0 -310
@@ -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