kore-memory 2.5.0__tar.gz → 3.0.2__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.
- kore_memory-3.0.2/.coveragerc +19 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/CHANGELOG.md +114 -0
- kore_memory-3.0.2/PKG-INFO +822 -0
- kore_memory-3.0.2/README.md +773 -0
- kore_memory-3.0.2/docs/coding-memory-mode.md +235 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/audit.py +1 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/auth.py +7 -1
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/compressor.py +3 -2
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/config.py +1 -1
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/conflict_detector.py +22 -17
- kore_memory-3.0.2/kore_memory/consolidation.py +271 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/context_assembler.py +4 -3
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/database.py +134 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/embedder.py +2 -2
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/events.py +1 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/filesystem_overlay.py +35 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/filesystem_watcher.py +9 -1
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/entities.py +319 -14
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/main.py +105 -11
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/mcp_server.py +103 -11
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/models.py +41 -1
- kore_memory-3.0.2/kore_memory/policy_engine.py +228 -0
- kore_memory-3.0.2/kore_memory/privacy.py +45 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/ranking.py +50 -8
- kore_memory-3.0.2/kore_memory/repository/entity.py +157 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/lifecycle.py +21 -5
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/memory.py +226 -149
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/search.py +277 -22
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/sessions.py +16 -2
- kore_memory-3.0.2/kore_memory/structured.py +194 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/templates/dashboard.html +128 -85
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/vector_index.py +11 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/claude-code/README.md +4 -0
- kore_memory-3.0.2/presets/claude-code-coding.md +97 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/pyproject.toml +13 -2
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/package.json +1 -1
- {kore_memory-2.5.0 → kore_memory-3.0.2}/start.sh +3 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_api.py +27 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_conflict_detection.py +20 -15
- kore_memory-3.0.2/tests/test_coverage_gaps.py +246 -0
- kore_memory-3.0.2/tests/test_m1_graph_entity.py +370 -0
- kore_memory-3.0.2/tests/test_m2_structured_memory.py +328 -0
- kore_memory-3.0.2/tests/test_m3a_session_consolidation.py +355 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_mcp.py +43 -6
- kore_memory-3.0.2/tests/test_policy_engine.py +486 -0
- kore_memory-2.5.0/PKG-INFO +0 -803
- kore_memory-2.5.0/README.md +0 -754
- kore_memory-2.5.0/test_pagination_fix.py +0 -78
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/benchmark.yml +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/build-sdk.yml +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/ci.yml +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.github/workflows/publish.yml +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/.gitignore +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/CONTRIBUTING.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/LICENSE +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/MIGRATION-v0.6.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/article-devto.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/assets/favicon.svg +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/assets/logo.svg +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/docs/competitive-analysis-2025.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/docs/quickstart-v2.1.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/docs/v1.0-roadmap.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/examples/async_usage.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/examples/basic_usage.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/examples/langchain_example.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/hatch_build.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore-daemon.sh +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/__init__.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/acl.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/analytics.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/auto_tuner.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/cli.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/client.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/dashboard.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/decay.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/__init__.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/crewai.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/langchain.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/openai_agents.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/integrations/pydantic_ai.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/plugins.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/py.typed +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/__init__.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/repository/graph.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/scorer.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/summarizer.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/kore_memory/welcome.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/claude-code/mcp.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/cursor/README.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/presets/cursor/mcp.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/requirements.txt +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/scripts/assert_benchmarks.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/scripts/import_memory.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/.gitignore +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/README.md +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/package-lock.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/client.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/errors.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/index.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/src/types.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tests/client.test.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tests/errors.test.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tests/helpers.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tsconfig.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/tsup.config.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/sdk/js/vitest.config.ts +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/__init__.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/__init__.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/conftest_bench.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_a_temporal.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_b_conflicts.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_c_coding.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_d_graph.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/dataset_e_context.json +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/datasets/loaders.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/benchmarks/test_benchmarks.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/conftest.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_audit.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_auth_events.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_auto_tuner.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_cli.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_client.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_client_sync.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_crewai.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_dashboard.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_entities.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_langchain.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_ranking_engine.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_sessions.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v11_fixes.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v12_features.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v21_temporal.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_v2_features.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_wave3_graph.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_wave3_overlay.py +0 -0
- {kore_memory-2.5.0 → kore_memory-3.0.2}/tests/test_wave3_watcher.py +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[run]
|
|
2
|
+
source = kore_memory
|
|
3
|
+
omit =
|
|
4
|
+
# Integrations che richiedono dipendenze opzionali (pydantic-ai, openai-agents)
|
|
5
|
+
kore_memory/integrations/pydantic_ai.py
|
|
6
|
+
kore_memory/integrations/openai_agents.py
|
|
7
|
+
# Banner di benvenuto CLI — non coperto da test
|
|
8
|
+
kore_memory/welcome.py
|
|
9
|
+
# Entry point scripts — coperti da test funzionali, non unit
|
|
10
|
+
kore_memory/__main__.py
|
|
11
|
+
# Vector index sqlite-vec — richiede estensione sqlite-vec, testato in test-semantic CI
|
|
12
|
+
kore_memory/vector_index.py
|
|
13
|
+
|
|
14
|
+
[report]
|
|
15
|
+
exclude_lines =
|
|
16
|
+
pragma: no cover
|
|
17
|
+
def __repr__
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
raise NotImplementedError
|
|
@@ -11,6 +11,120 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
+
## [3.0.2] - 2026-04-28
|
|
15
|
+
|
|
16
|
+
### Theme: "Hardening & Bug Sweep"
|
|
17
|
+
|
|
18
|
+
Comprehensive bug-fixing release: 24 fixes across backend, dashboard, security, and infrastructure. No breaking changes.
|
|
19
|
+
|
|
20
|
+
### Fixed — Backend (Critical)
|
|
21
|
+
|
|
22
|
+
- **Data corruption in compressor**: `DELETE FROM memory_relations WHERE source_id = target_id` was unscoped — deleted ALL self-relations globally instead of only the newly merged record. Now scoped to `(new_id, new_id)`.
|
|
23
|
+
- **save_memory_batch bypassed entire pipeline**: Batch save was missing privacy filter, title generation, content_hash, structured extraction (facts/concepts/narrative), entity extraction, conflict detection, dedup, session_id, and all v2.1/M2 fields. Refactored with shared `_prepare_memory()` helper — full parity with single save.
|
|
24
|
+
- **Race condition in dedup (TOCTOU)**: Dedup check and INSERT were in separate transactions. Two concurrent identical saves could both pass the check. Now merged into a single transaction.
|
|
25
|
+
- **ZeroDivisionError in RRF fusion**: Setting `KORE_RRF_W_FTS=0` caused crash when that stream had results. Added `or 1.0` fallback.
|
|
26
|
+
- **search_by_tag returned incomplete data**: Missing `title`, `invalidated_at`, `compressed_into`, and all structured fields in SELECT. `_row_to_record` silently returned nulls.
|
|
27
|
+
- **assert in context_assembler**: Token budget invariant used `assert` (disabled with `python -O`). Replaced with `if/raise ValueError`.
|
|
28
|
+
|
|
29
|
+
### Fixed — Security
|
|
30
|
+
|
|
31
|
+
- **Auth bypass behind reverse proxy**: `_is_local()` checked only `request.client.host`, which is the proxy's IP (127.0.0.1) when behind nginx/Caddy. Now detects `X-Forwarded-For`/`X-Real-IP` headers and requires API key when proxy is detected.
|
|
32
|
+
- **MCP import no size limit**: Docstring said "max 500" but code passed full list. Added `memories[:500]` truncation.
|
|
33
|
+
- **Search query DoS vector**: `/search` had no `max_length` on query parameter. Added `max_length=1000`.
|
|
34
|
+
- **CSP redundancy**: Removed `'unsafe-inline'` from `script-src` (redundant when nonce is present).
|
|
35
|
+
|
|
36
|
+
### Fixed — Infrastructure
|
|
37
|
+
|
|
38
|
+
- **VectorIndex memory leak**: Legacy in-memory cache grew unbounded (one entry per agent, all embeddings in RAM). Added LRU eviction with max 20 agents.
|
|
39
|
+
- **Timer leak in filesystem_watcher**: `stop_all()` stopped observers but didn't cancel pending debounce timers. Timers could fire after shutdown, causing DB operations on closed connections.
|
|
40
|
+
- **init_db() at import time in MCP server**: Any `import kore_memory.mcp_server` triggered full DB initialization. Replaced with lazy `_ensure_db()` using double-check locking.
|
|
41
|
+
|
|
42
|
+
### Fixed — Dashboard
|
|
43
|
+
|
|
44
|
+
- **Tab lost on refresh**: No URL state persistence. Added `location.hash` routing — tab survives refresh and browser back/forward.
|
|
45
|
+
- **Memories page empty for agents without relations**: Default view used `/graph/hubs` (requires relations). Changed to `/search?q=*`.
|
|
46
|
+
- **Relations section permanently broken**: `loadRelations(data.results)` where `/analytics` has no `results` field. Now fetches memories via `/search`.
|
|
47
|
+
- **Graph detail panel permanently broken after X close**: Inline `style.display='none'` overrode CSS class. Fixed to use `classList.remove('open')`.
|
|
48
|
+
- **Graph animation CPU leak**: `requestAnimationFrame` loop ran at 60fps on hidden canvas after navigating away. Now cancelled on page change.
|
|
49
|
+
- **HiDPI mouse coordinates wrong**: `screenToGraph()` used `canvas.width` (physical pixels) instead of `canvas.offsetWidth` (CSS pixels). Hover/drag/click hit wrong nodes on Retina displays.
|
|
50
|
+
- **Edit from graph detail race condition**: `setTimeout(300ms)` guess for API load. Now opens modal directly with node data.
|
|
51
|
+
- **NaN decay display**: `decay_score * 100` crashed on null. Defaults to 1.0.
|
|
52
|
+
- **No pagination indicator**: Added "Showing X of Y" when `has_more` is true.
|
|
53
|
+
- **Edit modal ignored tags**: Tags field was visible but values discarded on save. Now sends tags via API.
|
|
54
|
+
- **Session memories appended duplicates**: Clicking "View" multiple times appended cards. Now replaces existing detail.
|
|
55
|
+
- **Inline event handlers violated CSP**: `onmouseover`/`onmouseout` replaced with CSS `:hover`.
|
|
56
|
+
|
|
57
|
+
### Added
|
|
58
|
+
|
|
59
|
+
- Test: batch/single save parity test verifying structured fields (title, content_hash, memory_type) are populated identically.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## [3.0.0] - 2026-04-15
|
|
64
|
+
|
|
65
|
+
### Theme: "Cognitive Runtime + Coding Vertical GA"
|
|
66
|
+
|
|
67
|
+
Chiude Wave 3 con il lancio ufficiale del Coding Memory Mode e consolida Graph, Context Engine e Filesystem Watcher in un runtime cognitivo completo.
|
|
68
|
+
|
|
69
|
+
### Breaking Changes
|
|
70
|
+
|
|
71
|
+
- Nessuna breaking change nelle API REST o MCP rispetto a v2.x
|
|
72
|
+
- `pip install kore-memory` porta tutti i miglioramenti automaticamente
|
|
73
|
+
|
|
74
|
+
### Migration Guide (v2.2 → v3.0)
|
|
75
|
+
|
|
76
|
+
#### Da v2.2 (Context Engine)
|
|
77
|
+
- Nessuna azione richiesta per API REST e MCP esistenti
|
|
78
|
+
- Nuovo: `ranking_profile: "coding"` in `/context/assemble` e `memory_get_context()`
|
|
79
|
+
- Nuovo: categorie coding (`architectural_decision`, `root_cause`, `runbook`, `regression_note`)
|
|
80
|
+
|
|
81
|
+
#### Da v2.3 (Wave 3 Graph)
|
|
82
|
+
- Nessuna azione richiesta
|
|
83
|
+
- Nuovo: filesystem watcher (`pip install 'kore-memory[watcher]'`)
|
|
84
|
+
- Nuovo: tool MCP `memory_log_root_cause`
|
|
85
|
+
|
|
86
|
+
#### DB pre-esistenti (v1.x)
|
|
87
|
+
- Il sistema applica automaticamente le migrazioni incrementali al primo avvio
|
|
88
|
+
- Backup consigliato: `cp data/memory.db data/memory.db.bak`
|
|
89
|
+
|
|
90
|
+
### Added
|
|
91
|
+
|
|
92
|
+
#### Coding Memory Mode GA (#030)
|
|
93
|
+
- **`memory_log_root_cause`**: nuovo tool MCP per registrare root cause analysis con `symptom`, `affected_component`, `fix_applied`
|
|
94
|
+
- **`docs/coding-memory-mode.md`**: guida completa setup, workflow, tool table, benchmark, troubleshooting
|
|
95
|
+
- **`presets/claude-code-coding.md`**: snippet CLAUDE.md pronto all'uso per attivare il coding mode
|
|
96
|
+
- **`presets/claude-code/README.md`**: aggiornato con tutti i 4 tool coding
|
|
97
|
+
- Il Coding Memory Mode è ora GA e supporta repository-scoped namespace (`agent/repo`)
|
|
98
|
+
- Tutti i tool coding in un'unica installazione: `pip install kore-memory`
|
|
99
|
+
|
|
100
|
+
#### Quality & Coverage
|
|
101
|
+
- **`.coveragerc`**: esclude `vector_index.py`, `integrations/pydantic_ai.py`, `integrations/openai_agents.py`, `welcome.py` dai report locali (testati in CI separata o non applicabili)
|
|
102
|
+
- **`tests/test_coverage_gaps.py`**: 17 test mirati per branch non coperti (`/agents`, wildcard `q=*`, `update_memory` branches, session double-check locking)
|
|
103
|
+
- Coverage raggiunge **80%** sulla soglia CI (era 76% prima di questo ciclo)
|
|
104
|
+
|
|
105
|
+
### Closes
|
|
106
|
+
|
|
107
|
+
- #95 (#030 Coding Memory Mode GA)
|
|
108
|
+
- #96 (#031 Release v3.0.0)
|
|
109
|
+
|
|
110
|
+
### Wave 3 — Completata
|
|
111
|
+
|
|
112
|
+
| Issue | Feature | Versione |
|
|
113
|
+
|-------|---------|---------|
|
|
114
|
+
| #024 | Filesystem Overlay | v2.3.0 |
|
|
115
|
+
| #025 | File Watcher (watchdog) | v2.5.0 |
|
|
116
|
+
| #026 | Typed Relations | v2.3.0 |
|
|
117
|
+
| #027 | Subgraph Extraction | v2.3.0 |
|
|
118
|
+
| #028 | Hub Detection | v2.3.0 |
|
|
119
|
+
| #029 | Benchmark CI | v2.3.0 |
|
|
120
|
+
| #030 | Coding Memory Mode GA | v3.0.0 |
|
|
121
|
+
|
|
122
|
+
### Tests
|
|
123
|
+
- **648 test totali** (da 572 in v2.2 → +76 in Wave 3)
|
|
124
|
+
- Coverage: **80%** (soglia CI: 80%)
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
14
128
|
## [2.5.0] - 2026-04-14
|
|
15
129
|
|
|
16
130
|
### Theme: "Filesystem Watcher — Live Overlay Sync"
|