@luisarg/memory-auto 0.1.0 → 0.1.1
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.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/package.json +35 -7
- package/server/__init__.py +1 -0
- package/server/cli.py +27 -0
- package/server/pyproject.toml +14 -0
- package/server/registry.py +141 -0
- package/server/server.py +399 -0
- package/server/store.py +827 -0
- package/server/uv.lock +783 -0
- package/vault/README.md +38 -0
- package/vault/tag-vocabulary.json +175 -0
- package/vault/templates/context.md +20 -0
- package/vault/templates/convention.md +13 -0
- package/vault/templates/decision.md +23 -0
- package/vault/templates/fact.md +14 -0
- package/vault/templates/idea.md +28 -0
- package/vault/templates/learning.md +23 -0
- package/vault/templates/profile.md +13 -0
- package/vault/templates/source.md +21 -0
- package/vault/type-registry.yaml +75 -0
package/vault/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# memory-vault (starter)
|
|
2
|
+
|
|
3
|
+
OKF (Obsidian Knowledge Format) memory vault for the DSH memory plugins.
|
|
4
|
+
|
|
5
|
+
This directory is the **public skeleton** of the vault: templates, type registry
|
|
6
|
+
and tag vocabulary. Runtime data (`projects/`, `raw/`, `logs/`, `memory.db`,
|
|
7
|
+
`index.md`, `log.md`) is generated locally and excluded from git (`.gitignore`).
|
|
8
|
+
|
|
9
|
+
## Structure
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
memory-vault/
|
|
13
|
+
├── templates/ # OKF templates per entry type
|
|
14
|
+
├── type-registry.yaml # type registry (source of truth)
|
|
15
|
+
├── tag-vocabulary.json # tag normalization
|
|
16
|
+
├── projects/ # per-project entries (created on first use)
|
|
17
|
+
├── raw/ # loose Source entries (created on first use)
|
|
18
|
+
├── logs/ # digest logs (created on first use)
|
|
19
|
+
└── memory.db # SQLite index (FTS5), rebuildable from markdown
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`projects/`, `raw/`, `logs/` and `memory.db` are created automatically by
|
|
23
|
+
`memory-vault-server` on first use (`MemoryStore.__init__`).
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
Point the server (or the `memory-mcp` / `memory-auto` plugins) at this directory
|
|
28
|
+
with the `MEMORY_PATH` env var (or `DSH_MEMORY_PATH` for the DSH plugins):
|
|
29
|
+
|
|
30
|
+
```sh
|
|
31
|
+
MEMORY_PATH=./memory-vault uv run --directory ./memory-vault-server python server.py
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Rebuilding the index
|
|
35
|
+
|
|
36
|
+
The SQLite index is derived from the markdown; if it is missing or corrupted it
|
|
37
|
+
can be rebuilt with the server's `store_*` write tools, which upsert each entry
|
|
38
|
+
from its file.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
{
|
|
2
|
+
"canonical": {
|
|
3
|
+
"architecture": {
|
|
4
|
+
"aliases": [
|
|
5
|
+
"arch",
|
|
6
|
+
"design",
|
|
7
|
+
"system-design"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
"python": {
|
|
11
|
+
"aliases": [
|
|
12
|
+
"py",
|
|
13
|
+
"python3"
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
"typescript": {
|
|
17
|
+
"aliases": [
|
|
18
|
+
"ts",
|
|
19
|
+
"typescript"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"testing": {
|
|
23
|
+
"aliases": [
|
|
24
|
+
"test",
|
|
25
|
+
"tests",
|
|
26
|
+
"testing"
|
|
27
|
+
]
|
|
28
|
+
},
|
|
29
|
+
"ci-cd": {
|
|
30
|
+
"aliases": [
|
|
31
|
+
"ci",
|
|
32
|
+
"cd",
|
|
33
|
+
"github-actions",
|
|
34
|
+
"actions"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"docker": {
|
|
38
|
+
"aliases": [
|
|
39
|
+
"docker",
|
|
40
|
+
"container"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"database": {
|
|
44
|
+
"aliases": [
|
|
45
|
+
"db",
|
|
46
|
+
"sqlite",
|
|
47
|
+
"sql"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"cli": {
|
|
51
|
+
"aliases": [
|
|
52
|
+
"command-line",
|
|
53
|
+
"terminal"
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"performance": {
|
|
57
|
+
"aliases": [
|
|
58
|
+
"perf",
|
|
59
|
+
"optimization"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"security": {
|
|
63
|
+
"aliases": [
|
|
64
|
+
"security",
|
|
65
|
+
"auth"
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
"ui-ux": {
|
|
69
|
+
"aliases": [
|
|
70
|
+
"ui",
|
|
71
|
+
"ux",
|
|
72
|
+
"frontend",
|
|
73
|
+
"interface"
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
"refactoring": {
|
|
77
|
+
"aliases": [
|
|
78
|
+
"refactor",
|
|
79
|
+
"cleanup"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"llm": {
|
|
83
|
+
"aliases": [
|
|
84
|
+
"ai",
|
|
85
|
+
"openrouter",
|
|
86
|
+
"model"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
"documentation": {
|
|
90
|
+
"aliases": [
|
|
91
|
+
"docs",
|
|
92
|
+
"readme"
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
"automation": {
|
|
96
|
+
"aliases": [
|
|
97
|
+
"auto",
|
|
98
|
+
"script",
|
|
99
|
+
"makefile"
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
"travel": {
|
|
103
|
+
"aliases": [
|
|
104
|
+
"japan",
|
|
105
|
+
"trip"
|
|
106
|
+
]
|
|
107
|
+
},
|
|
108
|
+
"cv": {
|
|
109
|
+
"aliases": [
|
|
110
|
+
"curriculum",
|
|
111
|
+
"resume"
|
|
112
|
+
]
|
|
113
|
+
},
|
|
114
|
+
"debugging": {
|
|
115
|
+
"aliases": [
|
|
116
|
+
"debug",
|
|
117
|
+
"fix",
|
|
118
|
+
"bug"
|
|
119
|
+
]
|
|
120
|
+
},
|
|
121
|
+
"env-config": {
|
|
122
|
+
"aliases": [
|
|
123
|
+
"env",
|
|
124
|
+
"config",
|
|
125
|
+
"secrets",
|
|
126
|
+
"environment"
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
"migration": {
|
|
130
|
+
"aliases": [
|
|
131
|
+
"migrate",
|
|
132
|
+
"data-migration"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
"decision": {
|
|
136
|
+
"aliases": []
|
|
137
|
+
},
|
|
138
|
+
"fact": {
|
|
139
|
+
"aliases": []
|
|
140
|
+
},
|
|
141
|
+
"rate-limit": {
|
|
142
|
+
"aliases": []
|
|
143
|
+
},
|
|
144
|
+
"pipeline": {
|
|
145
|
+
"aliases": ["etl", "data-pipeline"]
|
|
146
|
+
},
|
|
147
|
+
"athena": {
|
|
148
|
+
"aliases": ["aws-athena", "s3"]
|
|
149
|
+
},
|
|
150
|
+
"lightgbm": {
|
|
151
|
+
"aliases": ["lgbm", "model-training"]
|
|
152
|
+
},
|
|
153
|
+
"idea": {
|
|
154
|
+
"aliases": ["proposal", "hypothesis"]
|
|
155
|
+
},
|
|
156
|
+
"context": {
|
|
157
|
+
"aliases": ["situation", "constraint"]
|
|
158
|
+
},
|
|
159
|
+
"spike": {
|
|
160
|
+
"aliases": ["prototype", "poc"]
|
|
161
|
+
},
|
|
162
|
+
"feature-engineering": {
|
|
163
|
+
"aliases": ["features", "variables"]
|
|
164
|
+
},
|
|
165
|
+
"dsh": {
|
|
166
|
+
"aliases": ["deepseek-harness", "cordis"]
|
|
167
|
+
},
|
|
168
|
+
"opencode": {
|
|
169
|
+
"aliases": ["second-brain"]
|
|
170
|
+
},
|
|
171
|
+
"obsidian": {
|
|
172
|
+
"aliases": ["vault", "okf"]
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Context
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
confidence: 0.8
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# <% tp.file.title %>
|
|
13
|
+
|
|
14
|
+
## Situation
|
|
15
|
+
|
|
16
|
+
Estado y constraints en el momento.
|
|
17
|
+
|
|
18
|
+
## Constraints
|
|
19
|
+
|
|
20
|
+
Qué límites temporales / entorno.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Convention
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# <% tp.file.title %>
|
|
12
|
+
|
|
13
|
+
The convention. State the rule, when it applies, and where it is enforced.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Decision
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# <% tp.file.title %>
|
|
12
|
+
|
|
13
|
+
## Context
|
|
14
|
+
|
|
15
|
+
What was the situation that required a decision?
|
|
16
|
+
|
|
17
|
+
## Decision
|
|
18
|
+
|
|
19
|
+
What was decided?
|
|
20
|
+
|
|
21
|
+
## Consequences
|
|
22
|
+
|
|
23
|
+
What are the trade-offs, follow-ups, or reversibility notes?
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Fact
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
confidence: 1.0
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# <% tp.file.title %>
|
|
13
|
+
|
|
14
|
+
The fact.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Idea
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
confidence: 0.6
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# <% tp.file.title %>
|
|
13
|
+
|
|
14
|
+
## Idea
|
|
15
|
+
|
|
16
|
+
Propuesta / hipótesis no validada.
|
|
17
|
+
|
|
18
|
+
## Context
|
|
19
|
+
|
|
20
|
+
Situación que motivó la idea.
|
|
21
|
+
|
|
22
|
+
## Alternatives
|
|
23
|
+
|
|
24
|
+
¿ qué otras opciones se consideraron?
|
|
25
|
+
|
|
26
|
+
## Next
|
|
27
|
+
|
|
28
|
+
Cómo validar.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Learning
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# <% tp.file.title %>
|
|
12
|
+
|
|
13
|
+
## Problem
|
|
14
|
+
|
|
15
|
+
What was the symptom or problem?
|
|
16
|
+
|
|
17
|
+
## Root cause
|
|
18
|
+
|
|
19
|
+
What actually caused it?
|
|
20
|
+
|
|
21
|
+
## Solution
|
|
22
|
+
|
|
23
|
+
What fixed it, or what would have fixed it sooner?
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Profile
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
project: <% tp.user.config.project_name ?? "" %>
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# <% tp.file.title %>
|
|
12
|
+
|
|
13
|
+
Synthesized profile for this project. Capture tech stack, architectural patterns, environment, workflow preferences, and known constraints. Profile entries deduplicate by `(project, type)` — saving a new profile overwrites the previous one.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Source
|
|
3
|
+
title: <% tp.file.title %>
|
|
4
|
+
description: <fill me>
|
|
5
|
+
resource: ""
|
|
6
|
+
tags: []
|
|
7
|
+
timestamp: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
8
|
+
source_url: <url>
|
|
9
|
+
source_kind: article
|
|
10
|
+
captured_at: <% tp.date.now("YYYY-MM-DDTHH:mm:ssZ") %>
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# <% tp.file.title %>
|
|
14
|
+
|
|
15
|
+
## Summary
|
|
16
|
+
|
|
17
|
+
Brief summary of the source material.
|
|
18
|
+
|
|
19
|
+
## Captured content
|
|
20
|
+
|
|
21
|
+
Paste or describe the source content here (for offline or paywalled sources).
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Type Registry — single source of truth for all entry types.
|
|
2
|
+
# See openspec/changes/vault-foundation/specs/type-registry/spec.md
|
|
3
|
+
|
|
4
|
+
types:
|
|
5
|
+
- name: Decision
|
|
6
|
+
directory: decisions
|
|
7
|
+
singular: decision
|
|
8
|
+
tool: store_decision
|
|
9
|
+
template: templates/decision.md
|
|
10
|
+
extraction_hint: "Architectural or design choices that were made."
|
|
11
|
+
immutable: false
|
|
12
|
+
project_attached: true
|
|
13
|
+
|
|
14
|
+
- name: Fact
|
|
15
|
+
directory: facts
|
|
16
|
+
singular: fact
|
|
17
|
+
tool: store_fact
|
|
18
|
+
template: templates/fact.md
|
|
19
|
+
extraction_hint: "Stable, verifiable statements about the project (versions, conventions, constraints)."
|
|
20
|
+
immutable: false
|
|
21
|
+
project_attached: true
|
|
22
|
+
|
|
23
|
+
- name: Learning
|
|
24
|
+
directory: learnings
|
|
25
|
+
singular: learning
|
|
26
|
+
tool: store_learning
|
|
27
|
+
template: templates/learning.md
|
|
28
|
+
extraction_hint: "Non-obvious lessons, debugging insights, or solutions found."
|
|
29
|
+
immutable: false
|
|
30
|
+
project_attached: true
|
|
31
|
+
|
|
32
|
+
- name: Convention
|
|
33
|
+
directory: conventions
|
|
34
|
+
singular: convention
|
|
35
|
+
tool: store_convention
|
|
36
|
+
template: templates/convention.md
|
|
37
|
+
extraction_hint: "Style rules, naming patterns, and coding conventions."
|
|
38
|
+
immutable: false
|
|
39
|
+
project_attached: true
|
|
40
|
+
|
|
41
|
+
- name: Profile
|
|
42
|
+
directory: profiles
|
|
43
|
+
singular: profile
|
|
44
|
+
tool: store_profile
|
|
45
|
+
template: templates/profile.md
|
|
46
|
+
extraction_hint: "User profile or tech stack information for a project."
|
|
47
|
+
immutable: false
|
|
48
|
+
project_attached: true
|
|
49
|
+
|
|
50
|
+
- name: Idea
|
|
51
|
+
directory: ideas
|
|
52
|
+
singular: idea
|
|
53
|
+
tool: store_idea
|
|
54
|
+
template: templates/idea.md
|
|
55
|
+
extraction_hint: "Propuesta no validada, hipótesis o alternativa considerada (no implementada aún)."
|
|
56
|
+
immutable: false
|
|
57
|
+
project_attached: true
|
|
58
|
+
|
|
59
|
+
- name: Context
|
|
60
|
+
directory: contexts
|
|
61
|
+
singular: context
|
|
62
|
+
tool: store_context
|
|
63
|
+
template: templates/context.md
|
|
64
|
+
extraction_hint: "Estado situacional, constraints temporales, entorno o presunciones en el momento."
|
|
65
|
+
immutable: false
|
|
66
|
+
project_attached: true
|
|
67
|
+
|
|
68
|
+
- name: Source
|
|
69
|
+
directory: raw
|
|
70
|
+
singular: source
|
|
71
|
+
tool: store_source
|
|
72
|
+
template: templates/source.md
|
|
73
|
+
extraction_hint: null
|
|
74
|
+
immutable: true
|
|
75
|
+
project_attached: false
|