devmemory-cli 0.1.0.dev0__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.
Files changed (183) hide show
  1. devmemory_cli-0.1.0.dev0/.gitignore +62 -0
  2. devmemory_cli-0.1.0.dev0/CHANGELOG.md +354 -0
  3. devmemory_cli-0.1.0.dev0/DEMO.md +124 -0
  4. devmemory_cli-0.1.0.dev0/LICENSE +21 -0
  5. devmemory_cli-0.1.0.dev0/PKG-INFO +174 -0
  6. devmemory_cli-0.1.0.dev0/README.md +124 -0
  7. devmemory_cli-0.1.0.dev0/docs/ARCHITECTURE.md +2686 -0
  8. devmemory_cli-0.1.0.dev0/docs/CONFIGURATION.md +138 -0
  9. devmemory_cli-0.1.0.dev0/docs/DATA_AND_API_SPEC.md +1818 -0
  10. devmemory_cli-0.1.0.dev0/docs/ENTIRE_INTEGRATION.md +904 -0
  11. devmemory_cli-0.1.0.dev0/docs/ENTIRE_QUICKSTART.md +1365 -0
  12. devmemory_cli-0.1.0.dev0/docs/IMPLEMENTATION_STRATEGY.md +372 -0
  13. devmemory_cli-0.1.0.dev0/docs/MCP.md +59 -0
  14. devmemory_cli-0.1.0.dev0/docs/PROJECT_SPEC.md +1683 -0
  15. devmemory_cli-0.1.0.dev0/docs/STATE_LOOP.md +62 -0
  16. devmemory_cli-0.1.0.dev0/examples/demo/seed.py +216 -0
  17. devmemory_cli-0.1.0.dev0/pyproject.toml +177 -0
  18. devmemory_cli-0.1.0.dev0/src/devmemory/__about__.py +3 -0
  19. devmemory_cli-0.1.0.dev0/src/devmemory/__init__.py +14 -0
  20. devmemory_cli-0.1.0.dev0/src/devmemory/__main__.py +6 -0
  21. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/__init__.py +6 -0
  22. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/databricks.py +346 -0
  23. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/entire.py +444 -0
  24. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/git.py +408 -0
  25. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/graph.py +251 -0
  26. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/metrics.py +150 -0
  27. devmemory_cli-0.1.0.dev0/src/devmemory/adapters/tests.py +227 -0
  28. devmemory_cli-0.1.0.dev0/src/devmemory/analysis/__init__.py +19 -0
  29. devmemory_cli-0.1.0.dev0/src/devmemory/analysis/base.py +128 -0
  30. devmemory_cli-0.1.0.dev0/src/devmemory/analysis/chain.py +53 -0
  31. devmemory_cli-0.1.0.dev0/src/devmemory/analysis/llm.py +236 -0
  32. devmemory_cli-0.1.0.dev0/src/devmemory/analysis/rules.py +110 -0
  33. devmemory_cli-0.1.0.dev0/src/devmemory/api/__init__.py +10 -0
  34. devmemory_cli-0.1.0.dev0/src/devmemory/api/app.py +390 -0
  35. devmemory_cli-0.1.0.dev0/src/devmemory/api/mappers.py +187 -0
  36. devmemory_cli-0.1.0.dev0/src/devmemory/api/schemas.py +201 -0
  37. devmemory_cli-0.1.0.dev0/src/devmemory/cli/__init__.py +1 -0
  38. devmemory_cli-0.1.0.dev0/src/devmemory/cli/_errors.py +36 -0
  39. devmemory_cli-0.1.0.dev0/src/devmemory/cli/_render.py +79 -0
  40. devmemory_cli-0.1.0.dev0/src/devmemory/cli/analytics.py +136 -0
  41. devmemory_cli-0.1.0.dev0/src/devmemory/cli/analyze.py +58 -0
  42. devmemory_cli-0.1.0.dev0/src/devmemory/cli/app.py +163 -0
  43. devmemory_cli-0.1.0.dev0/src/devmemory/cli/checkpoint.py +199 -0
  44. devmemory_cli-0.1.0.dev0/src/devmemory/cli/compare.py +104 -0
  45. devmemory_cli-0.1.0.dev0/src/devmemory/cli/doctor.py +151 -0
  46. devmemory_cli-0.1.0.dev0/src/devmemory/cli/history.py +56 -0
  47. devmemory_cli-0.1.0.dev0/src/devmemory/cli/impact.py +95 -0
  48. devmemory_cli-0.1.0.dev0/src/devmemory/cli/init.py +91 -0
  49. devmemory_cli-0.1.0.dev0/src/devmemory/cli/mcp.py +66 -0
  50. devmemory_cli-0.1.0.dev0/src/devmemory/cli/memory.py +70 -0
  51. devmemory_cli-0.1.0.dev0/src/devmemory/cli/restore.py +91 -0
  52. devmemory_cli-0.1.0.dev0/src/devmemory/cli/search.py +48 -0
  53. devmemory_cli-0.1.0.dev0/src/devmemory/cli/serve.py +64 -0
  54. devmemory_cli-0.1.0.dev0/src/devmemory/cli/show.py +139 -0
  55. devmemory_cli-0.1.0.dev0/src/devmemory/cli/status.py +72 -0
  56. devmemory_cli-0.1.0.dev0/src/devmemory/cli/task.py +333 -0
  57. devmemory_cli-0.1.0.dev0/src/devmemory/config.py +302 -0
  58. devmemory_cli-0.1.0.dev0/src/devmemory/domain/__init__.py +5 -0
  59. devmemory_cli-0.1.0.dev0/src/devmemory/domain/enums.py +151 -0
  60. devmemory_cli-0.1.0.dev0/src/devmemory/domain/errors.py +188 -0
  61. devmemory_cli-0.1.0.dev0/src/devmemory/domain/models.py +452 -0
  62. devmemory_cli-0.1.0.dev0/src/devmemory/domain/taskloop.py +212 -0
  63. devmemory_cli-0.1.0.dev0/src/devmemory/environment.py +67 -0
  64. devmemory_cli-0.1.0.dev0/src/devmemory/logging.py +148 -0
  65. devmemory_cli-0.1.0.dev0/src/devmemory/mcp/__init__.py +12 -0
  66. devmemory_cli-0.1.0.dev0/src/devmemory/mcp/server.py +225 -0
  67. devmemory_cli-0.1.0.dev0/src/devmemory/paths.py +112 -0
  68. devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/__init__.py +7 -0
  69. devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/checkpoint.py +443 -0
  70. devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/feature_detect.py +53 -0
  71. devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/regression.py +141 -0
  72. devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/runlog.py +73 -0
  73. devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/status_rules.py +44 -0
  74. devmemory_cli-0.1.0.dev0/src/devmemory/py.typed +0 -0
  75. devmemory_cli-0.1.0.dev0/src/devmemory/services/__init__.py +9 -0
  76. devmemory_cli-0.1.0.dev0/src/devmemory/services/agent_context.py +287 -0
  77. devmemory_cli-0.1.0.dev0/src/devmemory/services/analysis.py +116 -0
  78. devmemory_cli-0.1.0.dev0/src/devmemory/services/analytics.py +328 -0
  79. devmemory_cli-0.1.0.dev0/src/devmemory/services/brief.py +53 -0
  80. devmemory_cli-0.1.0.dev0/src/devmemory/services/context.py +88 -0
  81. devmemory_cli-0.1.0.dev0/src/devmemory/services/databricks_sync.py +121 -0
  82. devmemory_cli-0.1.0.dev0/src/devmemory/services/features.py +85 -0
  83. devmemory_cli-0.1.0.dev0/src/devmemory/services/impact.py +47 -0
  84. devmemory_cli-0.1.0.dev0/src/devmemory/services/memory.py +212 -0
  85. devmemory_cli-0.1.0.dev0/src/devmemory/services/projects.py +226 -0
  86. devmemory_cli-0.1.0.dev0/src/devmemory/services/restore.py +194 -0
  87. devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/__init__.py +39 -0
  88. devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/collectors.py +263 -0
  89. devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/engine.py +426 -0
  90. devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/requirements.py +358 -0
  91. devmemory_cli-0.1.0.dev0/src/devmemory/services/trace.py +152 -0
  92. devmemory_cli-0.1.0.dev0/src/devmemory/services/versions.py +287 -0
  93. devmemory_cli-0.1.0.dev0/src/devmemory/storage/__init__.py +9 -0
  94. devmemory_cli-0.1.0.dev0/src/devmemory/storage/artifacts.py +113 -0
  95. devmemory_cli-0.1.0.dev0/src/devmemory/storage/db.py +205 -0
  96. devmemory_cli-0.1.0.dev0/src/devmemory/storage/graph_impacts.py +63 -0
  97. devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0001_init.sql +15 -0
  98. devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0002_versions.sql +210 -0
  99. devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0003_graph.sql +14 -0
  100. devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0004_taskloop.sql +82 -0
  101. devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0005_project_brief.sql +12 -0
  102. devmemory_cli-0.1.0.dev0/src/devmemory/storage/repositories.py +286 -0
  103. devmemory_cli-0.1.0.dev0/src/devmemory/storage/tasks.py +342 -0
  104. devmemory_cli-0.1.0.dev0/src/devmemory/storage/versions.py +604 -0
  105. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/README.md +33 -0
  106. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/index.html +17 -0
  107. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/package-lock.json +2120 -0
  108. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/package.json +28 -0
  109. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/App.tsx +81 -0
  110. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/api/client.ts +214 -0
  111. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/api/types.ts +522 -0
  112. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Async.tsx +34 -0
  113. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/AttemptCard.tsx +30 -0
  114. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/CommandPalette.tsx +176 -0
  115. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/DiffView.tsx +104 -0
  116. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/ErrorBoundary.tsx +27 -0
  117. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Icon.tsx +64 -0
  118. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Logo.tsx +17 -0
  119. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Sidebar.tsx +72 -0
  120. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Sparkline.tsx +95 -0
  121. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/TopBar.tsx +60 -0
  122. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/bits.tsx +68 -0
  123. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/charts.tsx +339 -0
  124. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/primitives.tsx +215 -0
  125. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/lib/format.ts +61 -0
  126. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/lib/status.ts +96 -0
  127. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/lib/useDebounced.ts +10 -0
  128. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/main.tsx +30 -0
  129. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Compare.tsx +170 -0
  130. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/FeatureDetail.tsx +85 -0
  131. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Features.tsx +84 -0
  132. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Intelligence.tsx +194 -0
  133. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Memory.tsx +66 -0
  134. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/NotFound.tsx +13 -0
  135. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Overview.tsx +237 -0
  136. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/SafeToChange.tsx +154 -0
  137. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Search.tsx +75 -0
  138. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/TaskDetail.tsx +505 -0
  139. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Tasks.tsx +201 -0
  140. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Timeline.tsx +179 -0
  141. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/VersionDetail.tsx +448 -0
  142. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/theme/ThemeProvider.tsx +70 -0
  143. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/theme/components.css +967 -0
  144. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/theme/theme.css +715 -0
  145. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/tsconfig.json +23 -0
  146. devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/vite.config.ts +26 -0
  147. devmemory_cli-0.1.0.dev0/src/devmemory/web/static/assets/index-CbV5njRH.js +78 -0
  148. devmemory_cli-0.1.0.dev0/src/devmemory/web/static/assets/index-DD-7ceZx.css +1 -0
  149. devmemory_cli-0.1.0.dev0/src/devmemory/web/static/index.html +18 -0
  150. devmemory_cli-0.1.0.dev0/tests/__init__.py +0 -0
  151. devmemory_cli-0.1.0.dev0/tests/conftest.py +183 -0
  152. devmemory_cli-0.1.0.dev0/tests/test_agent_context.py +151 -0
  153. devmemory_cli-0.1.0.dev0/tests/test_analysis.py +327 -0
  154. devmemory_cli-0.1.0.dev0/tests/test_analytics.py +213 -0
  155. devmemory_cli-0.1.0.dev0/tests/test_api.py +161 -0
  156. devmemory_cli-0.1.0.dev0/tests/test_api_tasks.py +121 -0
  157. devmemory_cli-0.1.0.dev0/tests/test_artifacts_restore.py +165 -0
  158. devmemory_cli-0.1.0.dev0/tests/test_checkpoint_phase6.py +111 -0
  159. devmemory_cli-0.1.0.dev0/tests/test_checkpoint_pipeline.py +162 -0
  160. devmemory_cli-0.1.0.dev0/tests/test_cli.py +40 -0
  161. devmemory_cli-0.1.0.dev0/tests/test_cli_checkpoint.py +82 -0
  162. devmemory_cli-0.1.0.dev0/tests/test_cli_compare_search.py +88 -0
  163. devmemory_cli-0.1.0.dev0/tests/test_cli_init_status.py +52 -0
  164. devmemory_cli-0.1.0.dev0/tests/test_collectors.py +208 -0
  165. devmemory_cli-0.1.0.dev0/tests/test_config.py +99 -0
  166. devmemory_cli-0.1.0.dev0/tests/test_databricks.py +412 -0
  167. devmemory_cli-0.1.0.dev0/tests/test_doctor.py +61 -0
  168. devmemory_cli-0.1.0.dev0/tests/test_dotenv.py +36 -0
  169. devmemory_cli-0.1.0.dev0/tests/test_e2e.py +130 -0
  170. devmemory_cli-0.1.0.dev0/tests/test_entire_adapter.py +69 -0
  171. devmemory_cli-0.1.0.dev0/tests/test_entire_checkpoints.py +148 -0
  172. devmemory_cli-0.1.0.dev0/tests/test_entire_real.py +58 -0
  173. devmemory_cli-0.1.0.dev0/tests/test_errors.py +46 -0
  174. devmemory_cli-0.1.0.dev0/tests/test_git_adapter.py +125 -0
  175. devmemory_cli-0.1.0.dev0/tests/test_graph_impact.py +217 -0
  176. devmemory_cli-0.1.0.dev0/tests/test_init_service.py +83 -0
  177. devmemory_cli-0.1.0.dev0/tests/test_logging.py +52 -0
  178. devmemory_cli-0.1.0.dev0/tests/test_mcp.py +205 -0
  179. devmemory_cli-0.1.0.dev0/tests/test_memory.py +133 -0
  180. devmemory_cli-0.1.0.dev0/tests/test_migrations.py +104 -0
  181. devmemory_cli-0.1.0.dev0/tests/test_paths.py +39 -0
  182. devmemory_cli-0.1.0.dev0/tests/test_taskloop.py +241 -0
  183. devmemory_cli-0.1.0.dev0/tests/test_versions.py +228 -0
@@ -0,0 +1,62 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.egg-info/
5
+ .eggs/
6
+ build/
7
+ dist/
8
+ *.so
9
+
10
+ # Virtual environments
11
+ .venv/
12
+ venv/
13
+ env/
14
+
15
+ # Secrets — the CLI loads .env; only .env.example is committed
16
+ .env
17
+ .env.*
18
+ !.env.example
19
+
20
+ # Test / type / lint caches
21
+ .pytest_cache/
22
+ .mypy_cache/
23
+ .ruff_cache/
24
+ .coverage
25
+ .coverage.*
26
+ htmlcov/
27
+ coverage.xml
28
+
29
+ # DevMemory local data (when DevMemory is run against this repo itself)
30
+ .devmemory/config.local.json
31
+ .devmemory/metadata.db
32
+ .devmemory/metadata.db-wal
33
+ .devmemory/metadata.db-shm
34
+ .devmemory/artifacts/
35
+ .devmemory/outbox/
36
+ .devmemory/runs/
37
+ .devmemory/cache/
38
+
39
+ # Entire local-only data (see .entire/.gitignore for the authoritative list)
40
+ .entire/tmp/
41
+ .entire/settings.local.json
42
+ .entire/metadata/
43
+ .entire/logs/
44
+
45
+ # Frontend (Phase 5+): the Vite source and the built bundle in
46
+ # src/devmemory/web/static/ are BOTH committed (the wheel ships the bundle).
47
+ # Only the transient build dir and dependencies are ignored.
48
+ node_modules/
49
+ src/devmemory/web/frontend/.vite/
50
+
51
+ # Editor / OS
52
+ .DS_Store
53
+ Thumbs.db
54
+ *.swp
55
+ .idea/
56
+ .vscode/*
57
+ !.vscode/extensions.json
58
+
59
+ # Scratch
60
+ scratch/
61
+ *.local
62
+ .dev/
@@ -0,0 +1,354 @@
1
+ # Changelog
2
+
3
+ All notable changes to DevMemory are recorded here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this project uses
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ### Added — State-aware coding loop
10
+
11
+ - A `Task` layer on top of the existing evidence collectors (Git, Entire, tests,
12
+ graph). At creation the human goal is normalized into explicit requirements
13
+ (LLM when a key is configured, else a deterministic rule split) and the base
14
+ commit is pinned.
15
+ - **State Engine** (`devmemory.services.taskloop`): every `refresh_state`
16
+ re-runs the collectors, re-evaluates not-yet-complete requirements against the
17
+ Git diff / checkpoint intent / test results, recomputes an evidence-based
18
+ status (`IN_PROGRESS` / `NEEDS_WORK` / `READY` / `BLOCKED`), and appends an
19
+ immutable `state_snapshots` row — the loop is observable as snapshot #1 → #2.
20
+ It never touches application code.
21
+ - Migration `0004_taskloop`: `tasks`, `requirements`, `issues`,
22
+ `task_test_runs`, `state_snapshots`, `task_commits`.
23
+ - MCP tools: `create_task`, `get_state`, `refresh_state`,
24
+ `set_requirement_status`, `report_issue`, `mark_complete`, `get_checkpoint`.
25
+ - CLI: `devmemory task new|state|refresh|complete|requirement|issue|resolve|list|history`
26
+ and `devmemory state` (the debug dashboard).
27
+ - `EntireAdapter.list_sessions()` (machine-readable `entire session list --json`).
28
+ - `AGENTS.md` (the agent operating protocol) and a workspace `.mcp.json`.
29
+ - Every collector degrades gracefully: no Entire → empty checkpoint; no graph →
30
+ `impact.available = false`; tests can't run → `ERROR` / `FAILED_TO_PARSE`
31
+ (never invented counts); no git → `BLOCKED`.
32
+
33
+ ### Changed — Dashboard redesign (Vite + React)
34
+
35
+ - The dashboard is now a Vite + React + TypeScript app (`src/devmemory/web/frontend/`),
36
+ built to `src/devmemory/web/static/` — committed, so `devmemory serve` still
37
+ needs no Node. The old vanilla `src/devmemory/api/static/` bundle is removed.
38
+ - New information architecture: **Overview** reads as a narrative (health
39
+ headline, a repeated-failure callout, a version-health strip), a redesigned
40
+ **Version** page with sticky in-page nav and a file-tree diff viewer, a new
41
+ **Safe to change?** page wrapping `POST /api/agent/check` for humans,
42
+ **Timeline** with status/feature filters, and a report-grade **Intelligence**
43
+ page with hand-rolled SVG charts (no chart library).
44
+ - New visual system: design tokens with system/light/dark themes (`?theme=`
45
+ override), a ⌘K command palette, skeleton loading, error boundaries, real
46
+ empty states, and a mobile nav.
47
+ - `test_dashboard_index_served` updated for the built bundle.
48
+
49
+ ### Added — Phase 14: demo, doctor, docs, end-to-end test
50
+
51
+ - `devmemory doctor` — checks the toolchain (Python, git, `entire`, the `graph`
52
+ plugin), the project (root, config, schema version), the outbox depth, and
53
+ which integration credentials are *present* (never their values). `--strict`
54
+ exits non-zero on any warning.
55
+ - `examples/demo/seed.py` — builds a self-contained demo repo: a small `pricing`
56
+ package with six Development Versions across three features, two regressions,
57
+ and a repeated failed approach, so every view and command has real data.
58
+ - `DEMO.md` — a five-minute runbook. `docs/CONFIGURATION.md` — every setting,
59
+ the secrets-from-env table, and the fact/analysis separation.
60
+ - `README.md` — a real quickstart replacing the Phase 0 placeholder.
61
+ - `tests/test_e2e.py` — one test driving the whole lifecycle through the real
62
+ CLI and dashboard API: init → success/regression/fix checkpoints → history,
63
+ show, compare, analyze, memory → `/api/project`, `/api/analytics`,
64
+ `/api/agent/check`, `doctor`.
65
+
66
+ ### Added — Phase 13: AI analysis layer
67
+
68
+ - `devmemory.analysis`: a provider fallback chain that turns one version's
69
+ normalized facts into an `Analysis` (summary / reasoning / recommendation /
70
+ warnings / risk). `AnalysisInput` is the only thing a provider sees — Git
71
+ stats, test/metric deltas, regressions, prior attempts, graph hotspots — never
72
+ raw source (a truncated diff only if `analysis.include_diff` is set) and never
73
+ a transcript.
74
+ - `RulesProvider` — deterministic, offline, never fails; always the tail of the
75
+ chain. `LLMProvider` — Anthropic / OpenAI / Gemini, one class, lazy SDK import,
76
+ key from the environment; any failure falls through.
77
+ - `fact_guard`: runs on every provider's output — clamps `risk` to
78
+ low/medium/high, forces it to at least `medium` when the recorded status is
79
+ adverse, sets `provider`/`model` itself (the model can't spoof them), and
80
+ secret-scrubs + length-caps all free text. Analysis is stored in its own table
81
+ and structurally cannot carry a fact field.
82
+ - Pipeline stage `generate_analysis` (after `collect_graph_impact`) — skipped
83
+ when `analysis.enabled = false`, degraded (never fatal) on failure; the version
84
+ and its facts are already persisted.
85
+ - CLI `devmemory analyze <ref>` (`--provider`, `--no-save`, `--json`).
86
+ - API `POST /api/versions/{ref}/analysis` re-runs the chain. `redact_secrets`
87
+ helper added to `logging`.
88
+
89
+ ### Added — Phase 12: change-impact analysis (Entire `graph` plugin)
90
+
91
+ - `GraphAdapter`: wraps `entire graph commit --json` (the official, no-egress
92
+ local code graph). Discovers the `entire-graph` binary in the managed plugin
93
+ dirs; degrades to `None` when missing or slow — never blocks a checkpoint.
94
+ Parses the entity-level change list (added / removed / renamed /
95
+ signature-changed / body-changed) with per-entity dependent counts; `hotspots`
96
+ ranks the risky ones.
97
+ - Opt-in: needs `entire plugin install graph` and `graph.enabled = true`. New
98
+ `GraphSettings` config section (binary, timeouts).
99
+ - Migration `0003_graph.sql` + `GraphImpactRepository` — one row per version,
100
+ full JSON payload plus denormalized summary columns. Local-only; never
101
+ published to Databricks.
102
+ - Pipeline stage `collect_graph_impact` (after `refresh_feature`) — skipped when
103
+ disabled/uninstalled, degraded on analysis failure.
104
+ - `services.impact.version_impact`: stored result, or computed once on demand.
105
+ - CLI `devmemory impact <ref>` (`--json`, `--stored-only`): the entity change
106
+ list, a hotspots table, and a "review before keeping" callout for
107
+ signature/removal changes with dependents.
108
+ - API `GET /api/versions/{ref}/impact`. Dashboard: a "Change impact" panel on the
109
+ version page. MCP tool `get_change_impact`.
110
+
111
+ ### Added — Phase 11: AI context API + MCP server
112
+
113
+ - `services.agent_context`: agent-facing, JSON-first shapes shared by the MCP
114
+ server and the REST `/api/agent/*` endpoints. `project_brief` (orientation:
115
+ HEAD/branch, checkpoint coverage, success rate, open features, recent adverse
116
+ versions, cautions), `recent_history`, `version_report` (brief + trace),
117
+ and `change_guidance` — a pre-flight risk read that returns a verdict
118
+ (`proceed` / `caution` / `high-risk`) with the specific prior failures to read.
119
+ Facts and rule-based reads only; no LLM interpretation.
120
+ - `devmemory mcp`: a read-only [MCP](https://modelcontextprotocol.io) server over
121
+ stdio (`fastmcp`). Tools: `get_project_context`, `get_version_history`,
122
+ `get_version`, `get_development_trace`, `get_previous_attempts`,
123
+ `check_before_change`, `search_versions`, `get_analytics`. `--print-config`
124
+ emits a ready `.mcp.json` fragment for the current repo. Requires the `mcp`
125
+ extra; a clear error otherwise.
126
+ - API: `GET /api/agent/context`, `GET /api/agent/history`, `POST /api/agent/check`.
127
+ - `docs/MCP.md`: wiring for Claude Code / Cursor, the tool table, the REST
128
+ equivalent.
129
+
130
+ ### Added — Phase 10: development intelligence + Databricks analytics
131
+
132
+ - `services.analytics.analytics_summary`: one report — regression leaderboard,
133
+ feature attempt/success/regression counts, file churn (with an adverse-change
134
+ ratio), agent effectiveness (success rate, tokens per success), a per-version
135
+ trend, and repeatedly-failed approaches (adverse versions clustered by their
136
+ exact changed-file signature, ≥2 occurrences). Carries a `source` field:
137
+ `local` (SQLite, always available — the demo path) or `databricks`.
138
+ - `adapters.databricks.DatabricksAdapter`: REST-only publishing and querying via
139
+ the SQL Statement Execution API against a serverless SQL warehouse — no Spark,
140
+ no cluster. `bootstrap()` creates a Delta star schema (`fact_versions` +
141
+ `fact_changed_files` / `fact_metrics` / `fact_tests` / `fact_regressions`);
142
+ `publish_version()` is an idempotent `MERGE`. Every value travels as a bound
143
+ named `:param`; table names come only from trusted `catalog`/`schema` config.
144
+ - Only a fixed 24-field allowlist (`_VERSION_FIELDS`) ever leaves the machine —
145
+ never source, diffs, transcripts, prompts, or secrets. The intent string is
146
+ truncated to 2000 chars. Credentials come from `DATABRICKS_HOST` /
147
+ `DATABRICKS_TOKEN` / `DATABRICKS_WAREHOUSE_ID` only.
148
+ - `services.databricks_sync`: an offline outbox. Every published version is
149
+ written to `.devmemory/outbox/<version>.json` first; if Databricks is
150
+ configured and reachable the pipeline pushes immediately and removes the file,
151
+ otherwise it stays queued. Local history never depends on any of this — a push
152
+ failure degrades the run, it does not abort it.
153
+ - Pipeline stage `publish_databricks` (before `create_artifact`): `skipped` when
154
+ not configured (queued to the outbox), `degraded` on a push failure.
155
+ - CLI: `devmemory analytics` (`--json`) and `devmemory databricks status` /
156
+ `devmemory databricks push`.
157
+ - API: `GET /api/analytics`.
158
+ - Dashboard: an **Intelligence** tab — the regression leaderboard, feature
159
+ attempts, file churn, agent effectiveness, an SVG trend sparkline, and the
160
+ repeatedly-failed-approaches callout, badged by `source`.
161
+
162
+ ### Added — Phase 9: project snapshots + safe restore
163
+
164
+ - `ArtifactStore`: a `.tar.gz` snapshot per version, built from `git archive`
165
+ (the committed tree, no working-tree noise), repacked through `tarfile` to
166
+ apply exclusions and record a deterministic sha256. Pipeline stage
167
+ `create_artifact` (skippable with `--no-snapshot` or `artifacts.enabled`).
168
+ - `GitAdapter` gains its only mutating operations: `archive_tar`, `create_tag`,
169
+ `stash_create` (a pure safety reference), `checkout_detached`, `reset_hard`.
170
+ - `services.restore`: `restore_preview` (reports the target commit, current HEAD,
171
+ dirty files, and the safety-tag name — touches nothing) and `restore_version`
172
+ — refuses a dirty tree unless `allow_dirty`, always writes a `devmemory/safety/<ts>`
173
+ tag at the current HEAD (plus a `git stash create` ref if dirty) *before*
174
+ moving HEAD, detached checkout by default, `--hard` only on explicit request,
175
+ records a `restore` event, and returns the exact recovery command.
176
+ - CLI: `devmemory restore <ref>` (`--yes`, `--hard`, `--allow-dirty`, `--json`) —
177
+ previews and prompts by default.
178
+ - API: `GET /api/versions/{ref}/restore/preview` and `POST .../restore`
179
+ (403 unless the server was started with `--enable-restore`).
180
+ - `devmemory show` now lists the version's snapshot.
181
+
182
+ ### Added — Phase 8: version comparison + search CLI
183
+
184
+ - CLI: `devmemory diff FROM TO` (raw git diff), `devmemory compare FROM TO`
185
+ (`--diff`, `--json`) — files by change type, line totals, metric deltas, test
186
+ deltas, status transition — and `devmemory search QUERY` (`--json`).
187
+ - `VersionDiff` / `/api/compare` now also report the version numbers, feature
188
+ transition, and the checkpoint on each side.
189
+ - Dev: `pytest-xdist`; CI runs the suite with `-n auto` (~4x faster).
190
+
191
+ ### Added — Phase 7: development memory / previous attempts
192
+
193
+ - `services.memory.previous_attempts`: given a scope (files being changed,
194
+ feature, intent), rank historical versions by changed-file overlap + feature
195
+ match + intent-keyword overlap (FTS) + adverse status. Returns each with a
196
+ "why this matched", a one-line result summary, and a recommendation. Failed and
197
+ regressed attempts only, unless successes are requested.
198
+ - Pipeline stage `check_previous_attempts`: warns during `devmemory checkpoint`
199
+ when the current change resembles a past regression ("similar prior attempt
200
+ V2 [REGRESSION] — …").
201
+ - CLI: `devmemory memory` (`--file`, `--feature`, `--intent`,
202
+ `--include-successes`, `--json`).
203
+ - API: `GET /api/attempts` and `GET /api/versions/{ref}/attempts`.
204
+ - Dashboard: the Memory tab now scores real previous attempts; the Version
205
+ detail page shows a "⚠ Previous attempts touching this area" panel.
206
+
207
+ ### Added — Phase 6: test + metric collection, regression detection
208
+
209
+ - `TestAdapter`: runs the configured `tests.command` and normalizes the result —
210
+ pytest / go / generic stdout parsers, a JUnit XML reader, timeout handling. A
211
+ non-zero exit with no parsed failures still counts as failed. Collection
212
+ failures degrade the run (the version is still recorded), they don't abort it.
213
+ - `MetricsAdapter`: reads metrics from a JSON file or a command's JSON stdout;
214
+ scalar (`{"accuracy": 93.4}`) and object (`{"latency": {"before", "after",
215
+ "unit"}}`) shapes; direction from config, then a name heuristic.
216
+ - `pipeline.regression.detect_regressions`: direction-aware metric comparison
217
+ against the previous relevant version (configurable percent threshold +
218
+ severity bands) and test comparison (newly-failing / dropped-passing). The
219
+ version's `before` is backfilled from the previous version's `after`.
220
+ - `status_rules.derive_status` now returns `REGRESSION` when regressions are
221
+ present.
222
+ - Pipeline stages added: `collect_metrics`, `detect_regression`,
223
+ `refresh_feature` (recomputes the feature's roll-up status from its versions).
224
+ - `services.features`: `refresh_feature_status`, feature roll-up
225
+ (`COMPLETE`/`PARTIAL`/`FAILED`/`IN_PROGRESS` from the latest version).
226
+ - CLI: `devmemory checkpoint` gains `--run-tests/--no-run-tests` and
227
+ `--metrics-file`. Config gains a `regression` section (thresholds).
228
+
229
+ ### Added — Phase 5: REST API + dashboard
230
+
231
+ - FastAPI app (`devmemory.api`): `/api/project` (+ `/api/status`), `/api/versions`,
232
+ `/api/versions/{ref}` (resolves `v7` / `7` / sha-prefix), `.../diff`,
233
+ `.../checkpoint`, `.../trace`, `/api/compare?from&to`, `/api/features`,
234
+ `/api/features/{ref}`, `/api/search`, `/api/health`, OpenAPI at `/api/docs`.
235
+ Per-request `ProjectContext` (own SQLite connection); domain errors map to
236
+ 404/400.
237
+ - `services.trace.build_trace`: the development trace — intent → agent → Entire
238
+ checkpoint → commit → files → tests → metrics → status → analysis — as an
239
+ ordered node list the UI draws as a connected chain.
240
+ - `services.features`: feature roll-up status and per-feature version history.
241
+ - Dashboard: a dependency-free, hash-routed single-page app served from the wheel
242
+ (`devmemory serve`) — Overview, Timeline, Version detail (record + trace +
243
+ metrics + files + syntax-coloured diff), Compare, Features, Memory (failed
244
+ approaches), Search. Light/dark theme with a toggle; design-token CSS.
245
+ - `devmemory serve` (`--host`, `--port`, `--open/--no-open`, `--enable-restore`):
246
+ picks a free port, opens the browser, runs uvicorn.
247
+
248
+ ### Added — Phase 4: `devmemory checkpoint` end-to-end
249
+
250
+ - The checkpoint pipeline (`devmemory.pipeline`): an ordered, individually-timed
251
+ set of stages — verify repo, resolve commit, check working tree, idempotency,
252
+ resolve Entire checkpoint, collect changes, environment, detect feature,
253
+ collect tests, determine status, build event, persist — each recorded in a
254
+ `RunLog` written to `.devmemory/runs/<run_id>.json`. Cloud/optional steps never
255
+ fail the run.
256
+ - Missing-checkpoint policy: `checkpoint` refuses without an Entire checkpoint
257
+ unless `--allow-no-entire`; uncertain (heuristic) associations are surfaced as
258
+ warnings. Dirty working tree is warned, not blocked.
259
+ - `feature_detect`: explicit flag → conventional-commit scope → intent keywords.
260
+ - `status_rules.derive_status`: explicit override → errors → regressions → test
261
+ outcome → needs-review.
262
+ - CLI: `devmemory checkpoint` (`--intent`, `--feature`, `--agent`, `--status`,
263
+ `--tests-passed/-failed`, `-m name=before:after`, `-e error`,
264
+ `--allow-no-entire`, `--force`, `--json`), `devmemory history` (timeline
265
+ table), `devmemory show <v7|7|sha> [--diff] [--json]` (full record with metric
266
+ direction, file marks, analysis panel, syntax-highlighted diff).
267
+ - `devmemory status` now reports version count, latest version/status/metrics,
268
+ in-progress features, last regression, and whether HEAD is recorded.
269
+ - Global `-v/--verbose`; CLI logs default to WARNING. Windows console output is
270
+ forced to UTF-8. structlog uses a lazy stderr factory (survives pytest capture).
271
+
272
+ ### Added — Phase 3: normalized event + version registry + persistence
273
+
274
+ - Migration `0002_versions`: the full schema — `versions` (with version number,
275
+ association method/confidence, environment + source-event JSON, run id, distinct
276
+ recorded/committed times), `changed_files`, `entire_checkpoints`,
277
+ `version_checkpoints` (many-to-many), `features`, `tests`, `metrics`,
278
+ `regressions`, `analysis` (1:1, kept separate from facts), `artifacts`,
279
+ `doc_flags`, `events`, plus an FTS5 `version_search` table and indexes.
280
+ - Domain: `DevelopmentEvent` (the normalized bridge adapters fill), `Metric`
281
+ (direction-aware, with delta / percent-change / improvement helpers),
282
+ `TestOutcome`, `Regression`, `Analysis`, `Artifact`, `DocFlag`, `Feature`, and
283
+ the persisted `DevelopmentVersion` record joining all of it.
284
+ - `VersionRepository`: numbering, idempotent lookup by commit, `create` /
285
+ `replace` (for `--force`) writing every child table in one transaction, full
286
+ hydration, `previous_relevant` (for regression detection), and FTS-backed
287
+ `search_ids` with a `LIKE` fallback.
288
+ - `CheckpointRepository` (upsert + version linking), `FeatureRepository`.
289
+ - Services (`devmemory.services.versions`): `create_version_from_event`
290
+ (idempotent; `--force` re-records in place), `get_version` (resolves
291
+ `v7`/`7`/sha-prefix), `list_versions`, `version_diff` (real git diff + metric
292
+ and test deltas), `search_versions`. Every create writes an audit `events` row.
293
+
294
+ ### Added — Phase 2: Entire checkpoint resolution
295
+
296
+ - `EntireAdapter.resolve_for_commit()` implements the association ladder:
297
+ `Entire-Checkpoint` git trailer (confidence 1.0) → `entire checkpoint explain
298
+ --commit --json` for session metadata → direct read of the
299
+ `refs/entire/checkpoints/<shard>/<id>` git object tree (offline; supplies the
300
+ intent from `<idx>/prompt.txt`, which the CLI envelope never includes) →
301
+ time-proximity heuristic against `entire checkpoint list --json` (confidence
302
+ ≤ 0.5, marked uncertain) → `None`. Checkpoint data is never fabricated.
303
+ - `EntireAdapter.get_checkpoint()`, `list_checkpoints()`, `transcript()`.
304
+ - Normalized `CheckpointReference` carries the association method + confidence,
305
+ the resolving git ref, per-session metadata, and merged token usage.
306
+ - `ProjectContext` now wires the Entire adapter (with the git adapter injected).
307
+ - Integration tests run against the real installed Entire CLI when present, as an
308
+ early-warning signal for `--json` shape drift.
309
+
310
+ ### Added — Phase 1: `devmemory init` + Git adapter
311
+
312
+ - `GitAdapter` (`devmemory.adapters.git`): subprocess-based, no GitPython. Repo
313
+ detection, HEAD/branch/commit metadata with parsed trailers, `Entire-Checkpoint`
314
+ trailer extraction, NUL-delimited name-status + numstat diff parsing (adds,
315
+ deletes, renames, binary), root-commit handling, working-tree state, ref-blob
316
+ reads for Entire checkpoint refs later.
317
+ - `EntireAdapter.probe()` (`devmemory.adapters.entire`): detects whether the
318
+ Entire CLI is installed and enabled, its version and configured agents.
319
+ Degrades gracefully; never fabricates.
320
+ - Domain models (`devmemory.domain.models`): `CommitInfo`, `ChangedFile`,
321
+ `DiffStat`, `WorkingTreeState`, `CheckpointReference` (+ sessions, token usage,
322
+ association method/confidence), `EntireStatus`, `Project`, `EnvironmentInfo`.
323
+ - `devmemory.environment`: best-effort toolchain snapshot (Python, platform,
324
+ git, Entire, package manager).
325
+ - Storage: `ProjectRepository` — the single place `projects` SQL lives.
326
+ - Services: `ProjectContext` (the wired bundle every entry point works through)
327
+ and `devmemory.services.projects` (`init_project`, `project_status`).
328
+ - CLI: `devmemory init` (`--name`, `--project-id`, `--force`, `--json`) and
329
+ `devmemory status` (`--json`), with shared Rich rendering and a `handle_errors`
330
+ decorator that maps the error taxonomy to exit codes under the CLI runner.
331
+ - `init` writes `.devmemory/config.json`, creates and migrates the database,
332
+ registers the project, and appends local-only paths to the repo `.gitignore`.
333
+
334
+ ### Added — Phase 0: repository & package foundation
335
+
336
+ - `devmemory` / `dm` console entry points with `--version` and a `version` command
337
+ that reports the detected toolchain (Python, git, Entire).
338
+ - Layered project configuration (`devmemory.config`): built-in defaults →
339
+ `.devmemory/config.json` → `.devmemory/config.local.json` → environment. Secrets
340
+ (Databricks token, LLM API keys) are resolved from the environment only and are
341
+ never loaded into the config object or written to disk.
342
+ - Project filesystem layout (`devmemory.paths`): a single `.devmemory/` directory,
343
+ with upward-walking project-root discovery.
344
+ - Structured logging (`devmemory.logging`) built on structlog, with a redaction
345
+ processor that scrubs sensitive keys and any live environment-secret value.
346
+ - Typed error taxonomy (`devmemory.domain.errors`) — every deliberate failure carries
347
+ a message, an optional next-step hint, and a CLI exit code.
348
+ - Domain enumerations (`devmemory.domain.enums`): version/feature status, change type,
349
+ metric direction, checkpoint association method.
350
+ - SQLite layer (`devmemory.storage`): connection management (WAL, foreign keys) and a
351
+ forward-only, transactional schema migration runner.
352
+ - Continuous integration: ruff, ruff-format, mypy (strict), and pytest on Linux and
353
+ Windows across Python 3.11–3.13.
354
+ - `docs/IMPLEMENTATION_STRATEGY.md` — the engineering audit and phased build plan.
@@ -0,0 +1,124 @@
1
+ # DevMemory — demo runbook
2
+
3
+ A five-minute walk-through. Everything is local; no accounts, no keys.
4
+
5
+ ## 0. Setup (once)
6
+
7
+ ```bash
8
+ python -m venv .venv
9
+ # Windows: .venv\Scripts\activate POSIX: source .venv/bin/activate
10
+ pip install -e ".[dev]"
11
+
12
+ python examples/demo/seed.py /tmp/devmemory-demo
13
+ cd /tmp/devmemory-demo
14
+ ```
15
+
16
+ The seed builds a small `pricing` package and records **six Development
17
+ Versions** across three features — Tax, Discounts, Rounding — including two
18
+ regressions and one repeated failed approach.
19
+
20
+ ## 1. The history
21
+
22
+ ```bash
23
+ devmemory history
24
+ ```
25
+
26
+ Six versions, each joining intent → feature → Δ lines → metrics → status. V2 and
27
+ V3 are `REGRESSION`.
28
+
29
+ ```bash
30
+ devmemory show v2 # the full record for one version
31
+ devmemory compare 1 2 # what changed, and the metric/test deltas
32
+ ```
33
+
34
+ ## 2. The memory — "has this failed before?"
35
+
36
+ V3 tried to paper over V2's regression by touching the same files. DevMemory
37
+ knows:
38
+
39
+ ```bash
40
+ devmemory memory --file pricing/core.py
41
+ ```
42
+
43
+ > **V2 [REGRESSION]** — quote_latency_ms 42 → 47 · *matched on: pricing/core.py*
44
+ > recommendation: this approach regressed here — avoid repeating it.
45
+
46
+ ## 3. The analysis (facts vs. interpretation)
47
+
48
+ ```bash
49
+ devmemory analyze v3
50
+ ```
51
+
52
+ The **facts** (Git, metrics, tests) are never touched. The `rules` provider adds
53
+ *interpretation* — risk `high`, a summary, a recommendation — and cites V2 as the
54
+ prior failure. Set `ANTHROPIC_API_KEY` / `OPENAI_API_KEY` / `GEMINI_API_KEY` and
55
+ add the provider to `analysis.providers` in `.devmemory/config.json` to use an
56
+ LLM instead; `rules` stays the guaranteed fallback.
57
+
58
+ ## 4. Cross-version intelligence
59
+
60
+ ```bash
61
+ devmemory analytics
62
+ ```
63
+
64
+ Regression leaderboard, feature attempt/success rates, file churn, and the
65
+ **repeatedly-failed approach** (V2 + V3, same file signature). With
66
+ `DATABRICKS_HOST` / `DATABRICKS_TOKEN` / `DATABRICKS_WAREHOUSE_ID` set and
67
+ `databricks.enabled = true`, `devmemory databricks push` publishes the same
68
+ normalized rows to Delta tables — never source, never transcripts.
69
+
70
+ ## 5. The dashboard
71
+
72
+ ```bash
73
+ devmemory serve
74
+ ```
75
+
76
+ - **Overview** — the health headline, the ⚠ *repeated failed approach* callout
77
+ (V2 + V3, same file signature), and the version-health strip
78
+ - **Timeline** — all six versions; filter to Regressions
79
+ - **Version → V2** — the development trace, files, regressions, the previous-attempts
80
+ panel, the analysis, and the diff (sticky in-page nav across the top)
81
+ - **Features → Discounts** — the attempts and the metric trajectory
82
+ - **Safe to change?** — type `pricing/core.py` and "change the discount tier
83
+ logic" → **high-risk**, with the two prior failures. This is the same read the
84
+ MCP server gives an agent, in a form a human can use.
85
+ - **Intelligence** — metric trend with regression markers, feature success rates,
86
+ churn vs. adverse changes, the regression leaderboard
87
+ - **Memory** — search previous attempts by file / intent
88
+
89
+ Press <kbd>⌘K</kbd> / <kbd>Ctrl-K</kbd> anywhere to jump to a version, feature, or
90
+ page. The theme follows your system and can be forced with `?theme=light|dark`.
91
+
92
+ ## 6. For the next AI agent
93
+
94
+ ```bash
95
+ devmemory mcp --print-config # an .mcp.json fragment for Claude Code / Cursor
96
+ ```
97
+
98
+ Wire it in, then the agent can call `check_before_change` **before** editing:
99
+
100
+ ```text
101
+ check_before_change(files=["pricing/core.py"], intent="change the discount logic")
102
+ → verdict: high-risk
103
+ "2 earlier attempts in this exact area failed — and more than once."
104
+ read V2, V3 first.
105
+ ```
106
+
107
+ Same three calls are plain HTTP on the running dashboard: `GET /api/agent/context`,
108
+ `GET /api/agent/history`, `POST /api/agent/check`.
109
+
110
+ ## 7. Optional: change-impact
111
+
112
+ ```bash
113
+ entire plugin install graph # one-time
114
+ devmemory impact v2
115
+ ```
116
+
117
+ > `signature_changed apply_discount` (pricing/core.py, **2 dependents**) — review
118
+ > before keeping.
119
+
120
+ ## 8. Health check
121
+
122
+ ```bash
123
+ devmemory doctor
124
+ ```
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DevMemory contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.