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.
- devmemory_cli-0.1.0.dev0/.gitignore +62 -0
- devmemory_cli-0.1.0.dev0/CHANGELOG.md +354 -0
- devmemory_cli-0.1.0.dev0/DEMO.md +124 -0
- devmemory_cli-0.1.0.dev0/LICENSE +21 -0
- devmemory_cli-0.1.0.dev0/PKG-INFO +174 -0
- devmemory_cli-0.1.0.dev0/README.md +124 -0
- devmemory_cli-0.1.0.dev0/docs/ARCHITECTURE.md +2686 -0
- devmemory_cli-0.1.0.dev0/docs/CONFIGURATION.md +138 -0
- devmemory_cli-0.1.0.dev0/docs/DATA_AND_API_SPEC.md +1818 -0
- devmemory_cli-0.1.0.dev0/docs/ENTIRE_INTEGRATION.md +904 -0
- devmemory_cli-0.1.0.dev0/docs/ENTIRE_QUICKSTART.md +1365 -0
- devmemory_cli-0.1.0.dev0/docs/IMPLEMENTATION_STRATEGY.md +372 -0
- devmemory_cli-0.1.0.dev0/docs/MCP.md +59 -0
- devmemory_cli-0.1.0.dev0/docs/PROJECT_SPEC.md +1683 -0
- devmemory_cli-0.1.0.dev0/docs/STATE_LOOP.md +62 -0
- devmemory_cli-0.1.0.dev0/examples/demo/seed.py +216 -0
- devmemory_cli-0.1.0.dev0/pyproject.toml +177 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/__about__.py +3 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/__init__.py +14 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/__main__.py +6 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/__init__.py +6 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/databricks.py +346 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/entire.py +444 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/git.py +408 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/graph.py +251 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/metrics.py +150 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/adapters/tests.py +227 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/analysis/__init__.py +19 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/analysis/base.py +128 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/analysis/chain.py +53 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/analysis/llm.py +236 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/analysis/rules.py +110 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/api/__init__.py +10 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/api/app.py +390 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/api/mappers.py +187 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/api/schemas.py +201 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/__init__.py +1 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/_errors.py +36 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/_render.py +79 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/analytics.py +136 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/analyze.py +58 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/app.py +163 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/checkpoint.py +199 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/compare.py +104 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/doctor.py +151 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/history.py +56 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/impact.py +95 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/init.py +91 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/mcp.py +66 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/memory.py +70 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/restore.py +91 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/search.py +48 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/serve.py +64 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/show.py +139 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/status.py +72 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/cli/task.py +333 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/config.py +302 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/domain/__init__.py +5 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/domain/enums.py +151 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/domain/errors.py +188 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/domain/models.py +452 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/domain/taskloop.py +212 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/environment.py +67 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/logging.py +148 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/mcp/__init__.py +12 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/mcp/server.py +225 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/paths.py +112 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/__init__.py +7 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/checkpoint.py +443 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/feature_detect.py +53 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/regression.py +141 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/runlog.py +73 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/pipeline/status_rules.py +44 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/py.typed +0 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/__init__.py +9 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/agent_context.py +287 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/analysis.py +116 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/analytics.py +328 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/brief.py +53 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/context.py +88 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/databricks_sync.py +121 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/features.py +85 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/impact.py +47 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/memory.py +212 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/projects.py +226 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/restore.py +194 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/__init__.py +39 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/collectors.py +263 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/engine.py +426 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/taskloop/requirements.py +358 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/trace.py +152 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/services/versions.py +287 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/__init__.py +9 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/artifacts.py +113 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/db.py +205 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/graph_impacts.py +63 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0001_init.sql +15 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0002_versions.sql +210 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0003_graph.sql +14 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0004_taskloop.sql +82 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/migrations/0005_project_brief.sql +12 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/repositories.py +286 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/tasks.py +342 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/storage/versions.py +604 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/README.md +33 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/index.html +17 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/package-lock.json +2120 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/package.json +28 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/App.tsx +81 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/api/client.ts +214 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/api/types.ts +522 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Async.tsx +34 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/AttemptCard.tsx +30 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/CommandPalette.tsx +176 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/DiffView.tsx +104 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/ErrorBoundary.tsx +27 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Icon.tsx +64 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Logo.tsx +17 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Sidebar.tsx +72 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/Sparkline.tsx +95 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/TopBar.tsx +60 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/bits.tsx +68 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/charts.tsx +339 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/components/primitives.tsx +215 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/lib/format.ts +61 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/lib/status.ts +96 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/lib/useDebounced.ts +10 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/main.tsx +30 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Compare.tsx +170 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/FeatureDetail.tsx +85 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Features.tsx +84 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Intelligence.tsx +194 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Memory.tsx +66 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/NotFound.tsx +13 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Overview.tsx +237 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/SafeToChange.tsx +154 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Search.tsx +75 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/TaskDetail.tsx +505 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Tasks.tsx +201 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/Timeline.tsx +179 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/routes/VersionDetail.tsx +448 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/theme/ThemeProvider.tsx +70 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/theme/components.css +967 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/src/theme/theme.css +715 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/tsconfig.json +23 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/frontend/vite.config.ts +26 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/static/assets/index-CbV5njRH.js +78 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/static/assets/index-DD-7ceZx.css +1 -0
- devmemory_cli-0.1.0.dev0/src/devmemory/web/static/index.html +18 -0
- devmemory_cli-0.1.0.dev0/tests/__init__.py +0 -0
- devmemory_cli-0.1.0.dev0/tests/conftest.py +183 -0
- devmemory_cli-0.1.0.dev0/tests/test_agent_context.py +151 -0
- devmemory_cli-0.1.0.dev0/tests/test_analysis.py +327 -0
- devmemory_cli-0.1.0.dev0/tests/test_analytics.py +213 -0
- devmemory_cli-0.1.0.dev0/tests/test_api.py +161 -0
- devmemory_cli-0.1.0.dev0/tests/test_api_tasks.py +121 -0
- devmemory_cli-0.1.0.dev0/tests/test_artifacts_restore.py +165 -0
- devmemory_cli-0.1.0.dev0/tests/test_checkpoint_phase6.py +111 -0
- devmemory_cli-0.1.0.dev0/tests/test_checkpoint_pipeline.py +162 -0
- devmemory_cli-0.1.0.dev0/tests/test_cli.py +40 -0
- devmemory_cli-0.1.0.dev0/tests/test_cli_checkpoint.py +82 -0
- devmemory_cli-0.1.0.dev0/tests/test_cli_compare_search.py +88 -0
- devmemory_cli-0.1.0.dev0/tests/test_cli_init_status.py +52 -0
- devmemory_cli-0.1.0.dev0/tests/test_collectors.py +208 -0
- devmemory_cli-0.1.0.dev0/tests/test_config.py +99 -0
- devmemory_cli-0.1.0.dev0/tests/test_databricks.py +412 -0
- devmemory_cli-0.1.0.dev0/tests/test_doctor.py +61 -0
- devmemory_cli-0.1.0.dev0/tests/test_dotenv.py +36 -0
- devmemory_cli-0.1.0.dev0/tests/test_e2e.py +130 -0
- devmemory_cli-0.1.0.dev0/tests/test_entire_adapter.py +69 -0
- devmemory_cli-0.1.0.dev0/tests/test_entire_checkpoints.py +148 -0
- devmemory_cli-0.1.0.dev0/tests/test_entire_real.py +58 -0
- devmemory_cli-0.1.0.dev0/tests/test_errors.py +46 -0
- devmemory_cli-0.1.0.dev0/tests/test_git_adapter.py +125 -0
- devmemory_cli-0.1.0.dev0/tests/test_graph_impact.py +217 -0
- devmemory_cli-0.1.0.dev0/tests/test_init_service.py +83 -0
- devmemory_cli-0.1.0.dev0/tests/test_logging.py +52 -0
- devmemory_cli-0.1.0.dev0/tests/test_mcp.py +205 -0
- devmemory_cli-0.1.0.dev0/tests/test_memory.py +133 -0
- devmemory_cli-0.1.0.dev0/tests/test_migrations.py +104 -0
- devmemory_cli-0.1.0.dev0/tests/test_paths.py +39 -0
- devmemory_cli-0.1.0.dev0/tests/test_taskloop.py +241 -0
- 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.
|