devmemory-cli 0.1.0.dev0__py3-none-any.whl

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 (95) hide show
  1. devmemory/__about__.py +3 -0
  2. devmemory/__init__.py +14 -0
  3. devmemory/__main__.py +6 -0
  4. devmemory/adapters/__init__.py +6 -0
  5. devmemory/adapters/databricks.py +346 -0
  6. devmemory/adapters/entire.py +444 -0
  7. devmemory/adapters/git.py +408 -0
  8. devmemory/adapters/graph.py +251 -0
  9. devmemory/adapters/metrics.py +150 -0
  10. devmemory/adapters/tests.py +227 -0
  11. devmemory/analysis/__init__.py +19 -0
  12. devmemory/analysis/base.py +128 -0
  13. devmemory/analysis/chain.py +53 -0
  14. devmemory/analysis/llm.py +236 -0
  15. devmemory/analysis/rules.py +110 -0
  16. devmemory/api/__init__.py +10 -0
  17. devmemory/api/app.py +390 -0
  18. devmemory/api/mappers.py +187 -0
  19. devmemory/api/schemas.py +201 -0
  20. devmemory/cli/__init__.py +1 -0
  21. devmemory/cli/_errors.py +36 -0
  22. devmemory/cli/_render.py +79 -0
  23. devmemory/cli/analytics.py +136 -0
  24. devmemory/cli/analyze.py +58 -0
  25. devmemory/cli/app.py +163 -0
  26. devmemory/cli/checkpoint.py +199 -0
  27. devmemory/cli/compare.py +104 -0
  28. devmemory/cli/doctor.py +151 -0
  29. devmemory/cli/history.py +56 -0
  30. devmemory/cli/impact.py +95 -0
  31. devmemory/cli/init.py +91 -0
  32. devmemory/cli/mcp.py +66 -0
  33. devmemory/cli/memory.py +70 -0
  34. devmemory/cli/restore.py +91 -0
  35. devmemory/cli/search.py +48 -0
  36. devmemory/cli/serve.py +64 -0
  37. devmemory/cli/show.py +139 -0
  38. devmemory/cli/status.py +72 -0
  39. devmemory/cli/task.py +333 -0
  40. devmemory/config.py +302 -0
  41. devmemory/domain/__init__.py +5 -0
  42. devmemory/domain/enums.py +151 -0
  43. devmemory/domain/errors.py +188 -0
  44. devmemory/domain/models.py +452 -0
  45. devmemory/domain/taskloop.py +212 -0
  46. devmemory/environment.py +67 -0
  47. devmemory/logging.py +148 -0
  48. devmemory/mcp/__init__.py +12 -0
  49. devmemory/mcp/server.py +225 -0
  50. devmemory/paths.py +112 -0
  51. devmemory/pipeline/__init__.py +7 -0
  52. devmemory/pipeline/checkpoint.py +443 -0
  53. devmemory/pipeline/feature_detect.py +53 -0
  54. devmemory/pipeline/regression.py +141 -0
  55. devmemory/pipeline/runlog.py +73 -0
  56. devmemory/pipeline/status_rules.py +44 -0
  57. devmemory/py.typed +0 -0
  58. devmemory/services/__init__.py +9 -0
  59. devmemory/services/agent_context.py +287 -0
  60. devmemory/services/analysis.py +116 -0
  61. devmemory/services/analytics.py +328 -0
  62. devmemory/services/brief.py +53 -0
  63. devmemory/services/context.py +88 -0
  64. devmemory/services/databricks_sync.py +121 -0
  65. devmemory/services/features.py +85 -0
  66. devmemory/services/impact.py +47 -0
  67. devmemory/services/memory.py +212 -0
  68. devmemory/services/projects.py +226 -0
  69. devmemory/services/restore.py +194 -0
  70. devmemory/services/taskloop/__init__.py +39 -0
  71. devmemory/services/taskloop/collectors.py +263 -0
  72. devmemory/services/taskloop/engine.py +426 -0
  73. devmemory/services/taskloop/requirements.py +358 -0
  74. devmemory/services/trace.py +152 -0
  75. devmemory/services/versions.py +287 -0
  76. devmemory/storage/__init__.py +9 -0
  77. devmemory/storage/artifacts.py +113 -0
  78. devmemory/storage/db.py +205 -0
  79. devmemory/storage/graph_impacts.py +63 -0
  80. devmemory/storage/migrations/0001_init.sql +15 -0
  81. devmemory/storage/migrations/0002_versions.sql +210 -0
  82. devmemory/storage/migrations/0003_graph.sql +14 -0
  83. devmemory/storage/migrations/0004_taskloop.sql +82 -0
  84. devmemory/storage/migrations/0005_project_brief.sql +12 -0
  85. devmemory/storage/repositories.py +286 -0
  86. devmemory/storage/tasks.py +342 -0
  87. devmemory/storage/versions.py +604 -0
  88. devmemory/web/static/assets/index-CbV5njRH.js +78 -0
  89. devmemory/web/static/assets/index-DD-7ceZx.css +1 -0
  90. devmemory/web/static/index.html +18 -0
  91. devmemory_cli-0.1.0.dev0.dist-info/METADATA +174 -0
  92. devmemory_cli-0.1.0.dev0.dist-info/RECORD +95 -0
  93. devmemory_cli-0.1.0.dev0.dist-info/WHEEL +4 -0
  94. devmemory_cli-0.1.0.dev0.dist-info/entry_points.txt +3 -0
  95. devmemory_cli-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1 @@
1
+ :root{--bg: #fcfcfd;--bg-elevated: #ffffff;--bg-sunken: #f5f6f8;--bg-hover: #f0f1f4;--bg-active: #e9eaef;--border: #e6e7ec;--border-strong: #d7d9e0;--border-accent: #d7d4fa;--text: #15171d;--text-secondary: #565c6b;--text-muted: #878d9b;--text-on-accent: #ffffff;--accent: #5b53e8;--accent-hover: #4a41dd;--accent-press: #3f37c9;--accent-soft: #eeedfd;--accent-border: #d9d6fa;--accent-text: #4b41d1;--ok: #12805c;--ok-soft: #e4f5ee;--ok-border: #b9e2d1;--ok-strong: #0e6b4d;--warn: #9a6700;--warn-soft: #fbf1de;--warn-border: #ecd9a8;--warn-strong: #855800;--bad: #cf2230;--bad-soft: #fdeceb;--bad-border: #f3c4c1;--bad-strong: #b31b28;--info: #0e6fd6;--info-soft: #e7f1fd;--info-border: #bcdafb;--info-strong: #0a5bb0;--series-1: #5b53e8;--series-2: #0e9f9f;--series-3: #e0821d;--series-4: #c6417c;--series-5: #6b8f2e;--series-6: #8a63d2;--r-1: 6px;--r-2: 9px;--r-3: 13px;--r-full: 999px;--shadow-xs: 0 1px 2px rgba(15, 17, 28, .04);--shadow-sm: 0 1px 3px rgba(15, 17, 28, .06), 0 1px 2px rgba(15, 17, 28, .04);--shadow-md: 0 4px 14px -3px rgba(15, 17, 28, .1), 0 2px 6px -2px rgba(15, 17, 28, .06);--shadow-lg: 0 20px 48px -12px rgba(15, 17, 28, .2), 0 6px 16px -6px rgba(15, 17, 28, .12);--ease: cubic-bezier(.2, .7, .2, 1);--dur-1: .11s;--dur-2: .19s;--font-sans: "Inter var", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, system-ui, sans-serif;--font-mono: "JetBrains Mono", ui-monospace, "SF Mono", "Cascadia Code", Menlo, Consolas, monospace;--sidebar-w: 236px;--topbar-h: 56px;--content-max: 1200px;color-scheme:light}:root[data-theme=dark]{--bg: #0c0d11;--bg-elevated: #15161b;--bg-sunken: #101116;--bg-hover: #1c1e25;--bg-active: #24262e;--border: #24262e;--border-strong: #34373f;--border-accent: #39356c;--text: #e7e8ec;--text-secondary: #9aa0ad;--text-muted: #6b7280;--text-on-accent: #ffffff;--accent: #8b83f7;--accent-hover: #9a93f9;--accent-press: #7a70f0;--accent-soft: #1e1c3a;--accent-border: #38346b;--accent-text: #a49dfa;--ok: #3fb98c;--ok-soft: #0d271f;--ok-border: #1c4438;--ok-strong: #58c9a0;--warn: #e0a43b;--warn-soft: #2a2009;--warn-border: #4a3a15;--warn-strong: #edb857;--bad: #f2555a;--bad-soft: #2c1416;--bad-border: #522328;--bad-strong: #f7726f;--info: #4a9eff;--info-soft: #0c2137;--info-border: #1c3a5c;--info-strong: #6bb0ff;--series-1: #8b83f7;--series-2: #35c0bf;--series-3: #f0a44e;--series-4: #e46aa0;--series-5: #9dc256;--series-6: #b18df0;--shadow-xs: 0 1px 2px rgba(0, 0, 0, .4);--shadow-sm: 0 1px 3px rgba(0, 0, 0, .45), 0 1px 2px rgba(0, 0, 0, .3);--shadow-md: 0 8px 24px -6px rgba(0, 0, 0, .55), 0 2px 8px -2px rgba(0, 0, 0, .4);--shadow-lg: 0 24px 60px -12px rgba(0, 0, 0, .7), 0 8px 20px -8px rgba(0, 0, 0, .5);color-scheme:dark}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:15px;-webkit-text-size-adjust:100%}body{font-family:var(--font-sans);font-feature-settings:"cv05" 1,"cv08" 1,"ss03" 1;background:var(--bg);color:var(--text);line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer;border:none;background:none}svg{display:block}code,pre,.mono{font-family:var(--font-mono);font-size:.86em;font-feature-settings:normal}::selection{background:var(--accent-soft);color:var(--accent-text)}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--r-1)}*{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}*::-webkit-scrollbar{width:10px;height:10px}*::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--r-full);border:3px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:var(--text-muted);background-clip:content-box}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}h1,h2,h3{letter-spacing:-.02em;line-height:1.2;font-weight:640}.h-page{font-size:1.5rem;font-weight:660;letter-spacing:-.025em}.h-section{font-size:.75rem;font-weight:620;letter-spacing:.06em;text-transform:uppercase;color:var(--text-secondary)}.text-sm{font-size:.8125rem}.text-xs{font-size:.75rem}.muted{color:var(--text-muted)}.secondary{color:var(--text-secondary)}.tnum{font-variant-numeric:tabular-nums}.plus{color:var(--ok)}.minus{color:var(--bad)}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#root{min-height:100vh}.app-shell{display:grid;grid-template-columns:var(--sidebar-w) minmax(0,1fr);min-height:100vh}.app-main{display:flex;flex-direction:column;min-width:0;overflow-x:clip}.app-content{flex:1;width:100%;max-width:var(--content-max);margin:0 auto;padding:28px 36px 72px}@media (max-width: 960px){.app-shell{grid-template-columns:1fr}.app-content{padding:20px 18px 56px}}.card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:var(--r-3);box-shadow:var(--shadow-xs)}.card--pad{padding:18px 20px}.card--flush>.card__body{padding:0}.card__head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 18px;border-bottom:1px solid var(--border)}.card__head .h-section{margin:0}.card__body{padding:16px 18px}.card__body--flush{padding:0}.grid{display:grid;gap:16px}.grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid--3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid--4{grid-template-columns:repeat(4,minmax(0,1fr))}@media (max-width: 900px){.grid--2,.grid--3,.grid--4{grid-template-columns:1fr}}@media (min-width: 901px) and (max-width: 1120px){.grid--4{grid-template-columns:repeat(2,minmax(0,1fr))}}.badge{display:inline-flex;align-items:center;gap:5px;padding:2px 8px 2px 6px;border-radius:var(--r-full);font-size:.6875rem;font-weight:600;letter-spacing:.01em;border:1px solid transparent;white-space:nowrap;line-height:1.5}.badge__dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}.badge--ok{color:var(--ok-strong);background:var(--ok-soft);border-color:var(--ok-border)}.badge--bad{color:var(--bad-strong);background:var(--bad-soft);border-color:var(--bad-border)}.badge--warn{color:var(--warn-strong);background:var(--warn-soft);border-color:var(--warn-border)}.badge--info{color:var(--info-strong);background:var(--info-soft);border-color:var(--info-border)}.badge--neutral{color:var(--text-secondary);background:var(--bg-sunken);border-color:var(--border)}.badge--accent{color:var(--accent-text);background:var(--accent-soft);border-color:var(--accent-border)}.pill{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:.6875rem;background:var(--bg-sunken);border:1px solid var(--border);padding:1px 6px;border-radius:var(--r-1);color:var(--text-secondary)}kbd{font-family:var(--font-mono);font-size:.6875rem;line-height:1;padding:3px 5px;border-radius:5px;border:1px solid var(--border-strong);border-bottom-width:2px;background:var(--bg-elevated);color:var(--text-secondary)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:8px 13px;border-radius:var(--r-2);font-size:.8125rem;font-weight:560;border:1px solid var(--border-strong);background:var(--bg-elevated);color:var(--text);transition:background var(--dur-1) var(--ease),border-color var(--dur-1) var(--ease),transform var(--dur-1) var(--ease)}.btn:hover{background:var(--bg-hover)}.btn:active{transform:translateY(.5px)}.btn--primary{background:var(--accent);border-color:var(--accent);color:var(--text-on-accent)}.btn--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.btn--ghost{border-color:transparent;background:transparent}.btn--ghost:hover{background:var(--bg-hover)}.btn--sm{padding:5px 9px;font-size:.75rem}.btn:disabled{opacity:.5;cursor:not-allowed}.input{width:100%;padding:9px 12px;border-radius:var(--r-2);border:1px solid var(--border-strong);background:var(--bg-elevated);color:var(--text);font-size:.875rem;transition:border-color var(--dur-1) var(--ease),box-shadow var(--dur-1) var(--ease)}.input::placeholder{color:var(--text-muted)}.input:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}select.input{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23878d9b' stroke-width='2.5' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:32px}.dm-table{width:100%;border-collapse:collapse;font-size:.8125rem}.dm-table th{text-align:left;padding:8px 12px;color:var(--text-muted);font-weight:560;font-size:.75rem;border-bottom:1px solid var(--border);white-space:nowrap}.dm-table td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:middle}.dm-table tr:last-child td{border-bottom:none}.dm-table tbody tr{transition:background var(--dur-1) var(--ease)}.dm-table tbody tr:hover{background:var(--bg-sunken)}.dm-table .r{text-align:right;font-variant-numeric:tabular-nums}.dm-table__scroll{overflow-x:auto}.link{color:var(--accent-text);font-weight:550}.link:hover{text-decoration:underline}.skeleton{position:relative;overflow:hidden;background:var(--bg-sunken);border-radius:var(--r-1)}.skeleton:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;transform:translate(-100%);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--bg-hover) 60%,transparent),transparent);animation:shimmer 1.4s infinite}@keyframes shimmer{to{transform:translate(100%)}}.spinner{width:16px;height:16px;border:2px solid var(--border-strong);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.state{text-align:center;padding:52px 24px;color:var(--text-muted)}.state__icon{width:40px;height:40px;margin:0 auto 12px;color:var(--text-muted);opacity:.7}.state__title{font-size:.9375rem;font-weight:560;color:var(--text-secondary);margin-bottom:3px}.state__sub{font-size:.8125rem}.page-head{margin-bottom:22px}.page-head__row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap}.page-head p{color:var(--text-secondary);font-size:.875rem;margin-top:4px}.route-fade{animation:routeFade var(--dur-2) var(--ease)}@keyframes routeFade{0%{opacity:0;transform:translateY(4px)}}hr.sep{border:none;border-top:1px solid var(--border);margin:22px 0}.stack{display:flex;flex-direction:column;gap:16px}.row{display:flex;align-items:center;gap:10px}.row--wrap{flex-wrap:wrap}.row .truncate{min-width:0}.spacer{flex:1}.sidebar-wrap{position:relative;z-index:40}.sidebar{position:sticky;top:0;height:100vh;display:flex;flex-direction:column;gap:3px;padding:16px 12px;background:var(--bg-elevated);border-right:1px solid var(--border);overflow-y:auto}.sidebar__brand{display:flex;align-items:center;gap:10px;padding:6px 8px 16px}.sidebar__name{font-weight:680;letter-spacing:-.02em;font-size:.95rem}.sidebar__repo{font-size:.6875rem;color:var(--text-muted)}.sidebar__nav{display:flex;flex-direction:column;gap:2px}.nav-link{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:var(--r-2);font-size:.8438rem;font-weight:520;color:var(--text-secondary);transition:background var(--dur-1) var(--ease),color var(--dur-1) var(--ease)}.nav-link:hover{background:var(--bg-hover);color:var(--text)}.nav-link--active{background:var(--accent-soft);color:var(--accent-text);font-weight:580}.nav-link--active svg{color:var(--accent)}.sidebar__foot{font-size:.6875rem;color:var(--text-muted);padding:10px 8px 4px;display:flex;flex-direction:column;gap:5px;border-top:1px solid var(--border)}.sidebar-scrim{display:none}@media (max-width: 960px){.sidebar-wrap{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none}.sidebar{position:fixed;left:0;top:0;width:var(--sidebar-w);transform:translate(-100%);transition:transform var(--dur-2) var(--ease);box-shadow:var(--shadow-lg)}.sidebar-wrap--open{pointer-events:auto}.sidebar-wrap--open .sidebar{transform:translate(0)}.sidebar-wrap--open .sidebar-scrim{display:block;position:fixed;top:0;right:0;bottom:0;left:0;background:#00000059;animation:routeFade var(--dur-2) var(--ease)}}.topbar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:10px;height:var(--topbar-h);padding:0 16px;background:color-mix(in srgb,var(--bg) 82%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--border)}.topbar__menu{display:none}.topbar__context{display:flex;align-items:center;gap:8px;min-width:0;font-size:.8125rem}.topbar__search{display:flex;align-items:center;gap:8px;padding:6px 10px;min-width:200px;border-radius:var(--r-2);border:1px solid var(--border);background:var(--bg-elevated);color:var(--text-muted);font-size:.8125rem;transition:border-color var(--dur-1) var(--ease)}.topbar__search:hover{border-color:var(--border-strong)}.topbar__search kbd{margin-left:auto}@media (max-width: 960px){.topbar__menu{display:inline-flex}.topbar__search span:not(kbd){display:none}.topbar__search{min-width:0}}@media (max-width: 560px){.topbar__search kbd{display:none}}.palette-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:#0a0b1066;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;animation:routeFade var(--dur-1) var(--ease)}.palette{width:min(600px,92vw);background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:var(--r-3);box-shadow:var(--shadow-lg);overflow:hidden;animation:paletteIn var(--dur-2) var(--ease)}@keyframes paletteIn{0%{opacity:0;transform:translateY(-8px) scale(.98)}}.palette__input{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--border);color:var(--text-muted)}.palette__field{flex:1;border:none;background:none;outline:none;font-size:.9375rem;color:var(--text)}.palette__list{max-height:52vh;overflow-y:auto;padding:6px}.palette__group{font-size:.6875rem;font-weight:620;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);padding:10px 10px 4px}.palette__item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;border-radius:var(--r-2);font-size:.8438rem;color:var(--text-secondary);text-align:left}.palette__item--active{background:var(--accent-soft);color:var(--accent-text)}.palette__title{flex:1;min-width:0}.palette__hint{font-size:.75rem;color:var(--text-muted);max-width:40%}.palette__empty{padding:28px;text-align:center;color:var(--text-muted);font-size:.875rem}.stat-tile{padding:15px 17px}.stat-tile__label{display:flex;align-items:center;gap:5px;font-size:.6875rem;font-weight:560;letter-spacing:.04em;text-transform:uppercase;color:var(--text-muted)}.stat-tile__value{font-size:1.65rem;font-weight:660;letter-spacing:-.03em;margin-top:5px;line-height:1.1}.stat-tile__value--ok{color:var(--ok)}.stat-tile__value--bad{color:var(--bad)}.stat-tile__value--warn{color:var(--warn)}.stat-tile__sub{font-size:.75rem;color:var(--text-secondary);margin-top:3px}.callout{border-width:1px;border-style:solid}.callout--warn{border-color:var(--warn-border);background:color-mix(in srgb,var(--warn-soft) 55%,var(--bg-elevated))}.callout--bad{border-color:var(--bad-border);background:color-mix(in srgb,var(--bad-soft) 45%,var(--bg-elevated))}.callout--ok{border-color:var(--ok-border);background:color-mix(in srgb,var(--ok-soft) 45%,var(--bg-elevated))}.callout .card__head{border-color:inherit}.vrow{display:grid;grid-template-columns:46px auto 1fr auto;gap:12px;align-items:center;padding:11px 18px;border-bottom:1px solid var(--border);transition:background var(--dur-1) var(--ease)}.vrow:last-child{border-bottom:none}.vrow:hover{background:var(--bg-sunken)}.vrow__id{font-weight:660;font-size:.8125rem}.vrow__main{min-width:0}.vrow__intent{font-size:.875rem}.vrow__meta{display:flex;gap:10px;font-size:.75rem;color:var(--text-muted);margin-top:2px;flex-wrap:wrap}.vrow__sha{justify-self:end}@media (max-width: 640px){.vrow{grid-template-columns:40px 1fr;row-gap:4px;align-items:start}.vrow>.badge{justify-self:start}.vrow__main{grid-column:1 / -1}.vrow__sha{display:none}}.frow{display:flex;align-items:center;gap:12px;padding:11px 18px;border-bottom:1px solid var(--border);transition:background var(--dur-1) var(--ease)}.frow:last-child{border-bottom:none}.frow:hover{background:var(--bg-sunken)}.frow__name{flex:1;min-width:0;font-size:.875rem;font-weight:520}.frow__dots{display:flex;gap:4px}.health-strip{display:grid;grid-template-columns:auto 1fr;gap:24px;align-items:center}.health-strip__dots{display:flex;gap:6px;flex-wrap:wrap}.health-strip__dot{display:grid;place-items:center;width:34px;height:34px;border-radius:var(--r-2);font-size:.625rem;font-weight:640;border:1.5px solid var(--border-strong);color:var(--text-secondary);transition:transform var(--dur-1) var(--ease)}.health-strip__dot:hover{transform:translateY(-2px)}.health-strip__dot--ok{border-color:var(--ok);color:var(--ok-strong);background:var(--ok-soft)}.health-strip__dot--bad{border-color:var(--bad);color:var(--bad-strong);background:var(--bad-soft)}.health-strip__dot--warn{border-color:var(--warn);color:var(--warn-strong);background:var(--warn-soft)}.health-strip__spark{min-width:0}@media (max-width: 720px){.health-strip{grid-template-columns:1fr;gap:14px}}.tl{position:relative;padding:6px 18px 6px 14px}.tl__item{position:relative;display:grid;grid-template-columns:22px 1fr;gap:12px;padding:14px 0;border-bottom:1px solid var(--border)}.tl__item:last-child{border-bottom:none}.tl__item:before{content:"";position:absolute;left:5px;top:26px;bottom:-14px;width:2px;background:var(--border)}.tl__item:last-child:before{display:none}.tl__dot{width:12px;height:12px;margin-top:5px;border-radius:50%;background:var(--bg-elevated);border:2.5px solid var(--border-strong);z-index:1}.tl__item--ok .tl__dot{border-color:var(--ok)}.tl__item--bad .tl__dot{border-color:var(--bad)}.tl__item--warn .tl__dot{border-color:var(--warn)}.tl__item--info .tl__dot{border-color:var(--info)}.tl__intent{font-size:.9375rem;margin-top:6px}.tl__sub{display:flex;gap:10px;flex-wrap:wrap;font-size:.75rem;color:var(--text-muted);margin-top:4px}.segmented{display:inline-flex;padding:3px;gap:2px;background:var(--bg-sunken);border:1px solid var(--border);border-radius:var(--r-2)}.segmented__btn{padding:5px 11px;border-radius:var(--r-1);font-size:.75rem;font-weight:540;color:var(--text-secondary)}.segmented__btn--active{background:var(--bg-elevated);color:var(--text);box-shadow:var(--shadow-xs)}.feat-card{display:block;transition:border-color var(--dur-1) var(--ease),transform var(--dur-1) var(--ease)}.feat-card:hover{border-color:var(--border-accent);transform:translateY(-1px)}.feat-card__track{display:flex;gap:8px;flex-wrap:wrap}.feat-card__node{display:inline-flex;align-items:center;gap:5px;padding:3px 7px;border-radius:var(--r-1);background:var(--bg-sunken);border:1px solid var(--border);font-size:.6875rem}.feat-card__vid{font-weight:620}.subnav{position:sticky;top:var(--topbar-h);z-index:20;display:flex;gap:4px;padding:8px 0;margin-bottom:8px;background:color-mix(in srgb,var(--bg) 82%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--border)}.subnav__link{padding:5px 11px;border-radius:var(--r-2);font-size:.8125rem;font-weight:520;color:var(--text-secondary)}.subnav__link:hover{background:var(--bg-hover)}.subnav__link--active{background:var(--accent-soft);color:var(--accent-text)}.scroll-mt{scroll-margin-top:calc(var(--topbar-h) + 52px)}.trace{display:flex;flex-direction:column}.trace__node{position:relative;display:grid;grid-template-columns:120px 1fr;gap:14px;padding:10px 0 10px 20px}.trace__node:before{content:"";position:absolute;left:4px;top:15px;width:9px;height:9px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.trace__node--entire:before{background:var(--info);box-shadow:0 0 0 3px var(--info-soft)}.trace__node--status:before,.trace__node--analysis:before{background:var(--warn);box-shadow:0 0 0 3px var(--warn-soft)}.trace__node:not(:last-child):after{content:"";position:absolute;left:8px;top:24px;bottom:-10px;width:2px;background:var(--border-strong)}.trace__label{font-size:.6875rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);padding-top:2px}.trace__value{font-size:.875rem;font-weight:500;word-break:break-word}.trace__detail{font-size:.75rem;color:var(--text-secondary);margin-top:2px}.metric-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 0;border-bottom:1px solid var(--border);font-size:.875rem}.metric-row:last-child{border-bottom:none}.files{display:flex;flex-direction:column;gap:2px}.files__row{display:flex;align-items:center;gap:10px;padding:5px 0;font-size:.8125rem}.files__mark{width:16px;height:16px;border-radius:4px;display:grid;place-items:center;font-size:.625rem;font-weight:700;flex:none;background:var(--bg-sunken);color:var(--text-muted)}.files__mark--added{background:var(--ok-soft);color:var(--ok-strong)}.files__mark--modified{background:var(--warn-soft);color:var(--warn-strong)}.files__mark--deleted{background:var(--bad-soft);color:var(--bad-strong)}.files__mark--renamed,.files__mark--copied{background:var(--info-soft);color:var(--info-strong)}.kv{display:grid;grid-template-columns:96px 1fr;gap:7px 14px;font-size:.875rem}.kv dt{color:var(--text-muted);font-size:.8125rem}.kv dd{word-break:break-word}.attempt{border:1px solid var(--border);border-left:3px solid var(--border-strong);border-radius:var(--r-2);padding:12px 14px;background:var(--bg-elevated)}.attempt--adverse{border-left-color:var(--bad)}.attempt__rec{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:.8125rem;color:var(--accent-text)}.warn-list,.rec-list{list-style:none;margin-top:10px;display:flex;flex-direction:column;gap:6px}.warn-list li,.rec-list li{display:flex;align-items:flex-start;gap:8px;font-size:.8438rem}.warn-list li svg{color:var(--warn);margin-top:2px;flex:none}.rec-list li svg{color:var(--accent);margin-top:2px;flex:none}.diff{font-family:var(--font-mono);font-size:.75rem;max-height:620px;overflow:auto}.diff__file{border-bottom:1px solid var(--border)}.diff__file:last-child{border-bottom:none}.diff__file-head{position:sticky;top:0;z-index:1;display:flex;align-items:center;gap:8px;width:100%;padding:8px 14px;background:var(--bg-sunken);border-bottom:1px solid var(--border);font-size:.75rem;text-align:left}.diff__body{overflow-x:auto}.diff__line{display:grid;grid-template-columns:44px 44px 16px 1fr;align-items:baseline}.diff__gutter{text-align:right;padding:0 8px;color:var(--text-muted);opacity:.6;-webkit-user-select:none;user-select:none;font-size:.6875rem}.diff__mark{text-align:center;color:var(--text-muted)}.diff__text{white-space:pre;padding-right:14px}.diff__line--add{background:var(--ok-soft)}.diff__line--add .diff__text,.diff__line--add .diff__mark{color:var(--ok-strong)}.diff__line--del{background:var(--bad-soft)}.diff__line--del .diff__text,.diff__line--del .diff__mark{color:var(--bad-strong)}.diff__line--hunk{background:var(--info-soft)}.diff__line--hunk .diff__text{color:var(--info-strong);white-space:pre-wrap}.input-icon{position:relative}.input-icon svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}.input-icon .input{padding-left:34px}.field-label{display:block;font-size:.75rem;font-weight:560;color:var(--text-secondary);margin-bottom:5px}textarea.input{line-height:1.5}.task-row{display:flex;align-items:center;gap:14px;padding:13px 18px;border-bottom:1px solid var(--border);transition:background var(--dur-1) var(--ease)}.task-row:last-child{border-bottom:none}.task-row:hover{background:var(--bg-sunken)}.task-row__id{font-size:.8125rem;font-weight:620;flex:none}.task-row__main{flex:1;min-width:0}.task-row__goal{font-size:.9rem}.task-row__meta{display:flex;gap:12px;flex-wrap:wrap;font-size:.75rem;color:var(--text-muted);margin-top:3px}.req-row{display:grid;grid-template-columns:104px 1fr;gap:12px;align-items:start;padding:9px 0;border-bottom:1px solid var(--border);font-size:.875rem}.req-row:last-child{border-bottom:none}.req-row__status{cursor:pointer;border:none;font:inherit;justify-self:start;transition:filter var(--dur-1) var(--ease)}.req-row__status:hover{filter:brightness(1.08)}.req-row__status:disabled{cursor:default;opacity:.6}.loop-prompt{margin:0;padding:12px 14px;background:var(--surface-2, var(--surface));border:1px solid var(--border);border-radius:var(--r-2);font-family:var(--font-mono);font-size:.8125rem;line-height:1.5;white-space:pre-wrap;word-break:break-word;max-height:320px;overflow-y:auto}
@@ -0,0 +1,18 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>DevMemory</title>
7
+ <meta name="description" content="Development-memory and version-intelligence dashboard" />
8
+ <link
9
+ rel="icon"
10
+ href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%235b53e8'/%3E%3Cpath d='M9 8h6a8 8 0 0 1 0 16H9z' fill='none' stroke='white' stroke-width='2.6'/%3E%3Ccircle cx='9' cy='8' r='2' fill='white'/%3E%3Ccircle cx='9' cy='24' r='2' fill='white'/%3E%3C/svg%3E"
11
+ />
12
+ <script type="module" crossorigin src="/static/assets/index-CbV5njRH.js"></script>
13
+ <link rel="stylesheet" crossorigin href="/static/assets/index-DD-7ceZx.css">
14
+ </head>
15
+ <body>
16
+ <div id="root"></div>
17
+ </body>
18
+ </html>
@@ -0,0 +1,174 @@
1
+ Metadata-Version: 2.5
2
+ Name: devmemory-cli
3
+ Version: 0.1.0.dev0
4
+ Summary: Development-memory and version-intelligence for AI-assisted software development
5
+ Project-URL: Documentation, https://github.com/KYadavPR/devmemory
6
+ Project-URL: Source, https://github.com/KYadavPR/devmemory
7
+ Author: DevMemory contributors
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Keywords: ai,checkpoint,databricks,development-memory,entire,git,mcp,version-intelligence
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
20
+ Classifier: Topic :: Software Development :: Quality Assurance
21
+ Classifier: Topic :: Software Development :: Version Control :: Git
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: fastapi>=0.111
24
+ Requires-Dist: jinja2>=3.1
25
+ Requires-Dist: platformdirs>=4.2
26
+ Requires-Dist: pydantic>=2.7
27
+ Requires-Dist: python-dotenv>=1.0
28
+ Requires-Dist: rich>=13.7
29
+ Requires-Dist: structlog>=24.1
30
+ Requires-Dist: typer>=0.12
31
+ Requires-Dist: uvicorn[standard]>=0.30
32
+ Provides-Extra: all
33
+ Requires-Dist: devmemory[databricks,llm,mcp]; extra == 'all'
34
+ Provides-Extra: databricks
35
+ Requires-Dist: databricks-sdk>=0.30; extra == 'databricks'
36
+ Provides-Extra: dev
37
+ Requires-Dist: devmemory[databricks,llm,mcp]; extra == 'dev'
38
+ Requires-Dist: mypy>=1.10; extra == 'dev'
39
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
40
+ Requires-Dist: pytest-xdist>=3.6; extra == 'dev'
41
+ Requires-Dist: pytest>=8.2; extra == 'dev'
42
+ Requires-Dist: ruff>=0.5; extra == 'dev'
43
+ Provides-Extra: llm
44
+ Requires-Dist: anthropic>=0.40; extra == 'llm'
45
+ Requires-Dist: google-genai>=0.3; extra == 'llm'
46
+ Requires-Dist: openai>=1.40; extra == 'llm'
47
+ Provides-Extra: mcp
48
+ Requires-Dist: fastmcp>=2.3; extra == 'mcp'
49
+ Description-Content-Type: text/markdown
50
+
51
+ <h1 align="center">DevMemory</h1>
52
+
53
+ <p align="center">
54
+ <em>Development-memory and version-intelligence for AI-assisted software development.</em>
55
+ </p>
56
+
57
+ <p align="center">
58
+ <strong>Git remembers <em>what</em> changed. Entire remembers the AI-assisted development <em>context</em>.
59
+ DevMemory connects those changes with results, metrics, feature status and previous
60
+ attempts — so developers and future AI agents can understand the complete development
61
+ history, and avoid repeating past mistakes.</strong>
62
+ </p>
63
+
64
+ ---
65
+
66
+ DevMemory turns each meaningful AI-assisted change into a **Development Version**: one
67
+ durable record that joins the Entire checkpoint (the prompt, agent, and session), the Git
68
+ commit (the exact diff), the results (tests, metrics, regressions), an analysis layer
69
+ (kept strictly separate from the facts), and cross-version analytics.
70
+
71
+ It is consumed two ways — a **visual dashboard** for humans, and an **MCP server + REST
72
+ context API** for the next AI agent.
73
+
74
+ DevMemory sits *beside* your existing tools. It is **not** an IDE, a version-control
75
+ system, or an experiment tracker. You keep using VS Code, Cursor, Claude Code, the
76
+ terminal, and CI exactly as before.
77
+
78
+ ```text
79
+ developer / AI intent
80
+
81
+ AI coding agent ← you keep your editor & agent
82
+
83
+ Entire checkpoint ← why / who / how (github.com/entireio/cli)
84
+
85
+ Git commit ← what changed, exactly
86
+
87
+ tests · metrics · results ← the outcome
88
+
89
+ Development Version ← DevMemory: the join
90
+
91
+ ┌───────────┴───────────┐
92
+ dashboard MCP / API
93
+ (a human understands) (the next agent understands)
94
+ ```
95
+
96
+ ## Quickstart
97
+
98
+ ```bash
99
+ python -m venv .venv
100
+ # Windows: .venv\Scripts\activate POSIX: source .venv/bin/activate
101
+ pip install -e ".[dev]" # or: pip install devmemory
102
+
103
+ cd your-repo
104
+ devmemory init --name "My Project"
105
+ ```
106
+
107
+ Then, after each meaningful AI-assisted commit:
108
+
109
+ ```bash
110
+ devmemory checkpoint --intent "what you were trying to do"
111
+ ```
112
+
113
+ DevMemory finds the Entire checkpoint for the commit (or records without one),
114
+ runs your configured tests and metrics, detects regressions against the previous
115
+ version, checks whether this area has failed before, generates an analysis
116
+ (kept separate from the facts), and stores one **Development Version**.
117
+
118
+ ```bash
119
+ devmemory history # the timeline
120
+ devmemory show v7 # one version, end to end
121
+ devmemory compare 6 7 # what changed + metric/test deltas
122
+ devmemory memory --file auth.py # "has this area failed before?"
123
+ devmemory analyze v7 # interpretation (rules, or an LLM)
124
+ devmemory analytics # regressions, feature attempts, file churn
125
+ devmemory serve # the dashboard
126
+ devmemory mcp --print-config # wire the MCP server into Claude Code / Cursor
127
+ devmemory doctor # check the setup
128
+ ```
129
+
130
+ **Try it now** with a seeded demo:
131
+
132
+ ```bash
133
+ python examples/demo/seed.py /tmp/devmemory-demo && cd /tmp/devmemory-demo
134
+ devmemory serve
135
+ ```
136
+
137
+ See [`DEMO.md`](DEMO.md) for the walk-through and
138
+ [`docs/CONFIGURATION.md`](docs/CONFIGURATION.md) for every setting. `devmemory
139
+ checkpoint` collects tests and metrics only once you point it at them — set
140
+ `tests.command` and `metrics.file` in `.devmemory/config.json`.
141
+
142
+ Credentials (LLM keys, Databricks) are read from the environment — `cp
143
+ .env.example .env` and fill in what you need; the CLI loads it automatically.
144
+
145
+ ## What it is not
146
+
147
+ DevMemory sits *beside* your tools. It is not an IDE, a version-control system,
148
+ or an experiment tracker. It never sends source or transcripts anywhere unless
149
+ you configure it to, and an AI summary can never overwrite a Git, test, or metric
150
+ fact.
151
+
152
+ ## Status
153
+
154
+ Built in vertical slices — see
155
+ [`CHANGELOG.md`](CHANGELOG.md) for what each phase added and
156
+ [`docs/IMPLEMENTATION_STRATEGY.md`](docs/IMPLEMENTATION_STRATEGY.md) for the
157
+ engineering audit and plan.
158
+
159
+ ## Development
160
+
161
+ ```bash
162
+ ruff check . && ruff format --check .
163
+ mypy
164
+ pytest -n auto
165
+ ```
166
+
167
+ The dashboard is a Vite + React app in
168
+ [`src/devmemory/web/frontend/`](src/devmemory/web/frontend/); its built bundle is
169
+ committed to `src/devmemory/web/static/`, so `devmemory serve` never needs Node.
170
+ Rebuild it with `npm run build` in that directory (see its `README.md`).
171
+
172
+ ## License
173
+
174
+ [MIT](LICENSE)
@@ -0,0 +1,95 @@
1
+ devmemory/__about__.py,sha256=U0NBY1l40m3oZf65rx4xrlSjhIXii_tR5mos9B1EFHI,82
2
+ devmemory/__init__.py,sha256=S3laRKngEv5JJIwyP4veL4smzHmZfWR0eQsyAdjb19k,641
3
+ devmemory/__main__.py,sha256=vE2xc_YsYyU5JfHqIR8CKqvjvKSlOYdX9JWlz8Dfymk,113
4
+ devmemory/config.py,sha256=L6ex_2OKgIGckx8e5bv9lXfbKGMqri7ssfHW6bEbM5w,9939
5
+ devmemory/environment.py,sha256=b4oJkQMZEeooDoj86F33bdgUQW6Tl3WpdV8yYquRcf4,1953
6
+ devmemory/logging.py,sha256=LHjzK5YFUS5HM7Z6mDw2eqTYOOkmMCBVDahhM7CkhKw,4510
7
+ devmemory/paths.py,sha256=UNeRLMeB3BbmDvJUtmxdha8_QqzF_g8MzICAw4Jdt-A,3232
8
+ devmemory/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ devmemory/adapters/__init__.py,sha256=R8f9AucuyLwsDM2fejpcG5j1fPgM1GtTLxoDb78KLDw,257
10
+ devmemory/adapters/databricks.py,sha256=9WzyFaLJyQeiKxlZ16DKJXSwZ0egxo2BusuEUTSbDGg,13915
11
+ devmemory/adapters/entire.py,sha256=8casxyV_kXWhp5dlpO-dmuxHimVt_5VnJKTgc4haA3g,17009
12
+ devmemory/adapters/git.py,sha256=Si_fU8xQwawqZFm-1Q9CBf8MCbvIdZHLPnJXzIvck68,15483
13
+ devmemory/adapters/graph.py,sha256=jiBfw_7LwZ1QP78XtBhPqoBav5r4KxJAJQdIgq4YoVY,8276
14
+ devmemory/adapters/metrics.py,sha256=qLuNVMXaDS6BKVTJogpHPqkaxDBbJkJVZumX25ztWDM,4861
15
+ devmemory/adapters/tests.py,sha256=QvZCy--zLsk9Ecfe-TpoUa_XxjNbMoRBmVDVv_bOA6Q,8380
16
+ devmemory/analysis/__init__.py,sha256=wZm6gFBl0tMWn9XjZPHx1blNMmosnm9JxiYbHFAo0hs,521
17
+ devmemory/analysis/base.py,sha256=fg8vbEVUxiNTDISrA132EaWkIE7zu9RHrTFRMEQVqSo,3882
18
+ devmemory/analysis/chain.py,sha256=tnHAXCBzqflSHV7ipl_uFCE8JUHoDzYR-RQVmQSCrP8,1983
19
+ devmemory/analysis/llm.py,sha256=R9a4usayzKyq6mNy5DhBUmbsU4L9SKHiRlR1-V4GLwc,8033
20
+ devmemory/analysis/rules.py,sha256=waPz0OFj2PlrQ6_bWhSYiQ_UZUNT-G4OAOeUGuKIvNo,4242
21
+ devmemory/api/__init__.py,sha256=i68FIilci656b7cp9GrW2VcRhC9ISvbp9HH77o9S_lc,333
22
+ devmemory/api/app.py,sha256=XnWW27VGS7hhFkvX1e9Fc9c_O5GjMjjOzGQaOucvGMQ,15618
23
+ devmemory/api/mappers.py,sha256=84le5-rYcjR4PYaTLLBydWDJV09_8grvegt_w_IeKuo,6242
24
+ devmemory/api/schemas.py,sha256=qPAQyktLeYhKLWbTCwkXgwy8sS-SksntXdr7ZSXK8vw,4427
25
+ devmemory/cli/__init__.py,sha256=JwxOP-tB9aMhFJnZLIscqklr-_Pb1LKbi_tYmI1B3ZI,78
26
+ devmemory/cli/_errors.py,sha256=h7VtZDg53HUd4MCjQrlPpuAW14lEmNzVWftrYg5nEC4,1030
27
+ devmemory/cli/_render.py,sha256=upRkc9WkW_jJZKS9mwbz5saSQ_8E-NHyeuLUEWr-Fd0,2079
28
+ devmemory/cli/analytics.py,sha256=tZHdAclaSi38m5dB0My7fPDCUKgt0FcE9oGnO0-tiq8,4913
29
+ devmemory/cli/analyze.py,sha256=UBdJCEZhDO-3Fh5PGp5C-KZNrv_b4XignoUKgwXRw6U,2140
30
+ devmemory/cli/app.py,sha256=6MDG_DA019VcFk58mwW21zGyjJ4lmHzi6Utu3nWerTQ,5876
31
+ devmemory/cli/checkpoint.py,sha256=Koqb3PC1TGiD2TZlw1Lg6BKtbViM48OS_nprPPeESWo,6631
32
+ devmemory/cli/compare.py,sha256=Od8JE5AqSqOvYNTnQ2OZvwpaGBOTczQDV-uOV61DI7s,3995
33
+ devmemory/cli/doctor.py,sha256=AfLj7k9ALE49PjZP3U7mKRnjzQj8msVUcl6KaxYFvg8,5270
34
+ devmemory/cli/history.py,sha256=2NDMrhVVPk3EJ9pYMrQPfEwGx8Zsjrqe4sC-TddoX9s,1938
35
+ devmemory/cli/impact.py,sha256=aPZsRCsAK-fvKvls0g8Kzh4G1SFB483OcG1u7A3cCz0,3236
36
+ devmemory/cli/init.py,sha256=SgDhI9SzuBHfW7SF9SKW43SJXVgTXYnClSrR6izObzc,3090
37
+ devmemory/cli/mcp.py,sha256=RX5GpOOBHOHem0Ma_VngRXXdtS1p4S3nHbdh04hJGHs,2012
38
+ devmemory/cli/memory.py,sha256=DeeqSoa2IQaNtDanLl2fQSGgBHYl_05Wc1GOCeclRyw,2341
39
+ devmemory/cli/restore.py,sha256=9IS4F4howqxJibLBncN-2SlkgQcMp8rt6hDRgiIlrmk,3214
40
+ devmemory/cli/search.py,sha256=IW9uePgREFxJzb5lzoHBEZhVP06THSuQwZlSkTtdR6k,1523
41
+ devmemory/cli/serve.py,sha256=uZEBPUKL3A7rOvM8G5b0JSfWAy23uZTrcZTReH0CijY,2166
42
+ devmemory/cli/show.py,sha256=MnG0GD9-cREhsKO-C5KYkVrqd4UdM8fsCyGyTH819JE,4756
43
+ devmemory/cli/status.py,sha256=wQHX5I2rVK0uP6scOLqv78HjHBNP9LXnt0lR2EBrpMA,2640
44
+ devmemory/cli/task.py,sha256=-wJ6fhcn6WrhH1Nhd33VRPXfkMBuSgxAHUas6GiYjMA,12199
45
+ devmemory/domain/__init__.py,sha256=pMKOw7bHaUBj1zr1KFdAalWLW4YRwuP_LqR2kynPRnI,223
46
+ devmemory/domain/enums.py,sha256=KClC6C-lreZ2WH15iN2ZfdNk-KFA5_ouINTWhMOV25s,4097
47
+ devmemory/domain/errors.py,sha256=7ZSk_eDkwUDAA_SomfoDr9kq9UUxCpqeGTXHdduUXx4,5065
48
+ devmemory/domain/models.py,sha256=-Y8XcftZQC-r8gYlOC7SrhDC5ZY48F3Tlr_EwE7nbU4,12604
49
+ devmemory/domain/taskloop.py,sha256=9eEX4So7thcj5gOybLlHObLN2fsffCLnaQk3RO1MUYs,5916
50
+ devmemory/mcp/__init__.py,sha256=heNY9sQ8K_uPHxiotFer2wf0YYMDgXNVV3L2uk-fyQs,397
51
+ devmemory/mcp/server.py,sha256=j6SqwBLVJi3yp0VhTDNaYuwZgh7hzh1KT5IJ0jniVnQ,9310
52
+ devmemory/pipeline/__init__.py,sha256=17RzjMKXEr40rHzFwe4Ky9zvgpByJlCbsYI9Ll8GQXE,275
53
+ devmemory/pipeline/checkpoint.py,sha256=AbltoGktDx0so_rq_h8f70lZPbHVnWTYSM7IEv5XzR8,17391
54
+ devmemory/pipeline/feature_detect.py,sha256=jBANsrEimo_uxE7ZQMbgre-O1n66Ma7BjzvFvQXVspY,1871
55
+ devmemory/pipeline/regression.py,sha256=5cprKMbtRc6A6J_7YZVvzgt2sFFwhVJgh7vCxJKbvo4,4974
56
+ devmemory/pipeline/runlog.py,sha256=IWbMeFk4ZNORnbDHCjwILwJahC4mrXLOCaoawa5KGGw,2428
57
+ devmemory/pipeline/status_rules.py,sha256=UcBe_g8ZQChFvUUWzk3lgbI98CnhBpXVgKRmo0gsLjM,1238
58
+ devmemory/services/__init__.py,sha256=f4ebUVHF8CfP5wFRv64az2s-ZQp0EO6JjqtyrM2Bd-g,289
59
+ devmemory/services/agent_context.py,sha256=-Zoaz_jfjlkNTfkPClrivbFtil7RZIvxJWTu1dhhnYw,9029
60
+ devmemory/services/analysis.py,sha256=PKH1hrvHr_5z6Ac7qSs-nSv1a-XGVaxU4OORgTVCIcQ,4042
61
+ devmemory/services/analytics.py,sha256=h1fHf7dG3kMXs8Luky3nxZ7t3fCzq_Vnf1fPjNpuxd8,10836
62
+ devmemory/services/brief.py,sha256=ta8EpzQ2WdVLpHFiDIXxTwkOpJFOzKYGjBaLg1vP30Q,1751
63
+ devmemory/services/context.py,sha256=4fH74lmlhN54U_x4OJjinJzyFg3gf13rEhTYbt8EjrE,2982
64
+ devmemory/services/databricks_sync.py,sha256=P71cVHFRJ0QZw4_RHM5kwWjWoBKXAhuICtRUEpxttF4,4167
65
+ devmemory/services/features.py,sha256=sa1fUPXTfMibLYWgPqtqus1fFasF8uDeNdJCGf59wvo,2826
66
+ devmemory/services/impact.py,sha256=Z_Wj0IfWI9_MoMqyoRpMhnoxg-OpzPQL77iB20SOhGk,1528
67
+ devmemory/services/memory.py,sha256=JSbl3wR0LNnSNF-hmrFde0n-jvixPrMRpyGDnuNN5mQ,6275
68
+ devmemory/services/projects.py,sha256=INIapi0pheazqppw8b5l699QczYyaA1a-AmjY9sczbY,6976
69
+ devmemory/services/restore.py,sha256=CR_blYeUTI-engIn61E9zlRpfCAeYvSNyfrgFW_yPKg,6023
70
+ devmemory/services/trace.py,sha256=BRFvwztgfRJSlDDu3N3LAQeLEC-cssqIXS4QYk-0S14,4182
71
+ devmemory/services/versions.py,sha256=tkVOQKpv5DrG0eBalQzZNqsHyiXjrgbc1hrsUmWTXAE,9413
72
+ devmemory/services/taskloop/__init__.py,sha256=Xl4ggdja5lbRz7TbsbBTOKninWFGKj8n4RNwC83q_oc,919
73
+ devmemory/services/taskloop/collectors.py,sha256=bigE_t9JOEK0t3wNDntszT-5cTc7u4uROZk_Hg9Bsmk,9959
74
+ devmemory/services/taskloop/engine.py,sha256=dhNkUWghLHggGw_azcNaLZ_8xPHOOb_cqu0d6d2BGOw,15440
75
+ devmemory/services/taskloop/requirements.py,sha256=toRcGlsOZD-Oj8o2ltbArGDF9FU7aa30hv9gyBHlLhc,12169
76
+ devmemory/storage/__init__.py,sha256=RxOz4ag3AHHA8Z5Q7vHnDuG9Dg4DvauIJYkNT7oHSi0,285
77
+ devmemory/storage/artifacts.py,sha256=nCILs5rojiHICgGiBb-SazPAU4Ti_FiYVHrq80GFT9s,4065
78
+ devmemory/storage/db.py,sha256=hHpqnj7myfX2-wb8JPxPUz_XWBhmFyyQPfR5rR74we0,7468
79
+ devmemory/storage/graph_impacts.py,sha256=Hq-fIkYH31nzFW-Gq32NGkByNtc5Bpwho5YTmXZhXHo,2189
80
+ devmemory/storage/repositories.py,sha256=0urujOMG5Z6xfT9LHFnPb8PkFfOJFjfKyN_vp_Vk_6E,10765
81
+ devmemory/storage/tasks.py,sha256=24aHCDQb9DeqXs6L_Mrf1LG8mzwHLGS1SJlaIkEwkCw,12373
82
+ devmemory/storage/versions.py,sha256=shWegi-5kTPuRHhOouq_2_Y4AIHMNjsXNZ78ZRpLNgQ,22996
83
+ devmemory/storage/migrations/0001_init.sql,sha256=6yTUFlMA7_RaCP8wqcGkHFWiFzSn6x-1bRH-nRBPzi0,551
84
+ devmemory/storage/migrations/0002_versions.sql,sha256=C-p3YxGXp_9HhpchzYW5J084_5lhg0zMHYIEA3fJeLE,7143
85
+ devmemory/storage/migrations/0003_graph.sql,sha256=KBsxTZJ0anLZP-UY8-5KVbAYcZzn8OzfzltiQoQPoEM,626
86
+ devmemory/storage/migrations/0004_taskloop.sql,sha256=u9tguq9dcnhNHck0VD237PKbRmVpxskwFXgPDjr5xpk,3270
87
+ devmemory/storage/migrations/0005_project_brief.sql,sha256=fyFQhvGPoDfkmOM5jU1dxWBVPvjpdLqq6E5iqFtPIwA,478
88
+ devmemory/web/static/index.html,sha256=PoYCEYW3bGIl5UmblE1PtP5CU3wgokqOQIEpHVVAJ5o,880
89
+ devmemory/web/static/assets/index-CbV5njRH.js,sha256=xVOIfNu-E3NpzFISZR3taBAReEDlugX1oKyYP4pIt-s,288069
90
+ devmemory/web/static/assets/index-DD-7ceZx.css,sha256=ENv4On45S7UCge5BvTtBpVubu_2_Z22Y_azIdmppbVk,24921
91
+ devmemory_cli-0.1.0.dev0.dist-info/METADATA,sha256=ttMR_tZttnHH--MEOuH2zALuoQbz_RERhXHeuYb8SR4,6578
92
+ devmemory_cli-0.1.0.dev0.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
93
+ devmemory_cli-0.1.0.dev0.dist-info/entry_points.txt,sha256=84P4dQ5ulnGixAARqgkQC0gcueaj6ooNTHKtX2flRPM,81
94
+ devmemory_cli-0.1.0.dev0.dist-info/licenses/LICENSE,sha256=Oqy27sjlobIvU4yJgfWoQP0ySwLz0lFQ3fn6CnZGvL0,1079
95
+ devmemory_cli-0.1.0.dev0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ devmemory = devmemory.cli.app:main
3
+ dm = devmemory.cli.app:main
@@ -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.