smart-claude-memory-mcp 2.1.0
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/.claude-plugin/plugin.json +38 -0
- package/CHANGELOG.md +52 -0
- package/LICENSE +21 -0
- package/README.md +790 -0
- package/dist/chunker.js +33 -0
- package/dist/chunker.js.map +1 -0
- package/dist/config.js +23 -0
- package/dist/config.js.map +1 -0
- package/dist/curriculum/daemon.js +190 -0
- package/dist/curriculum/daemon.js.map +1 -0
- package/dist/curriculum/scanner.js +237 -0
- package/dist/curriculum/scanner.js.map +1 -0
- package/dist/index.js +429 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/migrations.js +128 -0
- package/dist/lib/migrations.js.map +1 -0
- package/dist/ollama.js +59 -0
- package/dist/ollama.js.map +1 -0
- package/dist/project-detect.js +102 -0
- package/dist/project-detect.js.map +1 -0
- package/dist/project.js +26 -0
- package/dist/project.js.map +1 -0
- package/dist/sleep/daemon.js +215 -0
- package/dist/sleep/daemon.js.map +1 -0
- package/dist/sleep/miner.js +285 -0
- package/dist/sleep/miner.js.map +1 -0
- package/dist/supabase.js +405 -0
- package/dist/supabase.js.map +1 -0
- package/dist/telemetry/emit.js +19 -0
- package/dist/telemetry/emit.js.map +1 -0
- package/dist/telemetry/pruner.js +141 -0
- package/dist/telemetry/pruner.js.map +1 -0
- package/dist/telemetry/types.js +2 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/tools/backlog.js +599 -0
- package/dist/tools/backlog.js.map +1 -0
- package/dist/tools/batch-freeze-patterns.js +243 -0
- package/dist/tools/batch-freeze-patterns.js.map +1 -0
- package/dist/tools/bloat-audit.js +101 -0
- package/dist/tools/bloat-audit.js.map +1 -0
- package/dist/tools/checkpoint.js +259 -0
- package/dist/tools/checkpoint.js.map +1 -0
- package/dist/tools/compact.js +60 -0
- package/dist/tools/compact.js.map +1 -0
- package/dist/tools/conflict.js +102 -0
- package/dist/tools/conflict.js.map +1 -0
- package/dist/tools/curriculum.js +225 -0
- package/dist/tools/curriculum.js.map +1 -0
- package/dist/tools/frozen-cache.js +106 -0
- package/dist/tools/frozen-cache.js.map +1 -0
- package/dist/tools/health.js +368 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/hygiene.js +309 -0
- package/dist/tools/hygiene.js.map +1 -0
- package/dist/tools/image.js +107 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/list-global-patterns.js +101 -0
- package/dist/tools/list-global-patterns.js.map +1 -0
- package/dist/tools/orchestrator.js +113 -0
- package/dist/tools/orchestrator.js.map +1 -0
- package/dist/tools/policy.js +90 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/refactor.js +220 -0
- package/dist/tools/refactor.js.map +1 -0
- package/dist/tools/save.js +42 -0
- package/dist/tools/save.js.map +1 -0
- package/dist/tools/search.js +189 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/setup.js +868 -0
- package/dist/tools/setup.js.map +1 -0
- package/dist/tools/shared-schemas.js +24 -0
- package/dist/tools/shared-schemas.js.map +1 -0
- package/dist/tools/skills.js +174 -0
- package/dist/tools/skills.js.map +1 -0
- package/dist/tools/sleep.js +239 -0
- package/dist/tools/sleep.js.map +1 -0
- package/dist/tools/sovereign-constitution.js +319 -0
- package/dist/tools/sovereign-constitution.js.map +1 -0
- package/dist/tools/summarize.js +55 -0
- package/dist/tools/summarize.js.map +1 -0
- package/dist/tools/sync.js +255 -0
- package/dist/tools/sync.js.map +1 -0
- package/dist/tools/system_dashboard.js +181 -0
- package/dist/tools/system_dashboard.js.map +1 -0
- package/dist/tools/update-rule.js +15 -0
- package/dist/tools/update-rule.js.map +1 -0
- package/dist/tools/verification.js +333 -0
- package/dist/tools/verification.js.map +1 -0
- package/dist/trajectory/daemon.js +270 -0
- package/dist/trajectory/daemon.js.map +1 -0
- package/dist/trajectory/stripper.js +124 -0
- package/dist/trajectory/stripper.js.map +1 -0
- package/dist/trajectory/summarizer.js +77 -0
- package/dist/trajectory/summarizer.js.map +1 -0
- package/dist/transactions/checkpoint.js +272 -0
- package/dist/transactions/checkpoint.js.map +1 -0
- package/dist/verification-gate.js +43 -0
- package/dist/verification-gate.js.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/hooks/README.md +54 -0
- package/hooks/md-policy.py +497 -0
- package/marketplace.json +13 -0
- package/package.json +66 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { embed } from "../ollama.js";
|
|
2
|
+
import { supabase, searchChunks, listBacklog, listArchive, } from "../supabase.js";
|
|
3
|
+
import { currentProjectId } from "../project.js";
|
|
4
|
+
/** Pure-number queries (e.g. "11468") -> direct SQL fetch by id. Bypasses
|
|
5
|
+
* vector ranking, which can fail to surface a known row when its embedding
|
|
6
|
+
* is squeezed out of top-K by stronger lexical neighbors in a 7k+ row set.
|
|
7
|
+
* Dual-scope is enforced at the app layer: project_id IN (current, GLOBAL?). */
|
|
8
|
+
const ID_PATTERN = /^\s*(\d{1,12})\s*$/;
|
|
9
|
+
/** Sovereign Decision-ID handles like SCM-S15-D1 or SCM-S15-D1-GLOBAL.
|
|
10
|
+
* Routed through metadata.context_id @> match (no vector embedding). */
|
|
11
|
+
const CONTEXT_ID_PATTERN = /^\s*(SCM-S\d+-D\d+(?:-GLOBAL)?)\s*$/i;
|
|
12
|
+
/** Narrow patterns for queries that unambiguously ask for the ARCHIVE. */
|
|
13
|
+
const ARCHIVE_PATTERNS = [
|
|
14
|
+
/\barchive[sd]?\b/i,
|
|
15
|
+
/\bcompleted\s+tasks?\b/i,
|
|
16
|
+
/\bdone\s+tasks?\b/i,
|
|
17
|
+
/\bfinished\s+tasks?\b/i,
|
|
18
|
+
/\bpast\s+tasks?\b/i,
|
|
19
|
+
];
|
|
20
|
+
/** Narrow patterns for queries that ask for the ACTIVE backlog. */
|
|
21
|
+
const BACKLOG_PATTERNS = [
|
|
22
|
+
/\b(active|pending|current|my|open)\s+backlog\b/i,
|
|
23
|
+
/\bbacklog\s+(tasks?|items?|list|snapshot)\b/i,
|
|
24
|
+
/^\s*backlog\s*$/i,
|
|
25
|
+
/^\s*pending\s+tasks?\s*$/i,
|
|
26
|
+
/^\s*what'?s?\s+next\??\s*$/i,
|
|
27
|
+
];
|
|
28
|
+
function matches(patterns, q) {
|
|
29
|
+
return patterns.some((re) => re.test(q));
|
|
30
|
+
}
|
|
31
|
+
function sortByPriorityThenAge(rows) {
|
|
32
|
+
return [...rows].sort((a, b) => a.priority - b.priority || Date.parse(a.created_at) - Date.parse(b.created_at));
|
|
33
|
+
}
|
|
34
|
+
export async function searchMemory(args) {
|
|
35
|
+
const projectId = args.project_id ?? currentProjectId;
|
|
36
|
+
const limit = args.limit ?? 5;
|
|
37
|
+
// Default behavior: dual-scope across the current project AND the reserved
|
|
38
|
+
// 'GLOBAL' bucket. Pass include_global:false to restrict to project_id only.
|
|
39
|
+
const includeGlobal = args.include_global ?? true;
|
|
40
|
+
// Precedence: id > context_id > archive > backlog > semantic.
|
|
41
|
+
//
|
|
42
|
+
// ID fallthrough — a query that is JUST a number is almost certainly a
|
|
43
|
+
// direct lookup ("show me row 11468"), not a semantic ask. Vector ranking
|
|
44
|
+
// on numeric tokens is meaningless and can hide rows whose neighbors won
|
|
45
|
+
// the cosine race. Direct SQL fetch is exact and respects dual-scope
|
|
46
|
+
// (current project_id OR 'GLOBAL' when include_global is true).
|
|
47
|
+
const idMatch = args.query.match(ID_PATTERN);
|
|
48
|
+
if (idMatch) {
|
|
49
|
+
const id = Number(idMatch[1]);
|
|
50
|
+
const projectFilter = includeGlobal
|
|
51
|
+
? `project_id.eq.${projectId},project_id.eq.GLOBAL`
|
|
52
|
+
: `project_id.eq.${projectId}`;
|
|
53
|
+
const { data, error } = await supabase
|
|
54
|
+
.from("memory_chunks")
|
|
55
|
+
.select("id, content, file_origin, chunk_index, metadata, project_id")
|
|
56
|
+
.eq("id", id)
|
|
57
|
+
.or(projectFilter)
|
|
58
|
+
.limit(1);
|
|
59
|
+
if (error) {
|
|
60
|
+
throw new Error(`Supabase id-lookup failed: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
const rows = (data ?? []);
|
|
63
|
+
return {
|
|
64
|
+
project_id: projectId,
|
|
65
|
+
query: args.query,
|
|
66
|
+
mode: "id",
|
|
67
|
+
include_global: includeGlobal,
|
|
68
|
+
count: rows.length,
|
|
69
|
+
results: rows.map((r) => ({
|
|
70
|
+
id: r.id,
|
|
71
|
+
content: r.content,
|
|
72
|
+
file_origin: r.file_origin,
|
|
73
|
+
chunk_index: r.chunk_index,
|
|
74
|
+
metadata: r.metadata,
|
|
75
|
+
similarity: 1.0,
|
|
76
|
+
project_id: r.project_id,
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Context-ID fallthrough — Sovereign Decision IDs like "SCM-S15-D1" or
|
|
81
|
+
// "SCM-S15-D1-GLOBAL". Use metadata.context_id @> containment (uses GIN)
|
|
82
|
+
// so the lookup is exact, dual-scope-aware, and never embedding-bottlenecked.
|
|
83
|
+
const ctxMatch = args.query.match(CONTEXT_ID_PATTERN);
|
|
84
|
+
if (ctxMatch) {
|
|
85
|
+
const contextId = ctxMatch[1];
|
|
86
|
+
const projectFilter = includeGlobal
|
|
87
|
+
? `project_id.eq.${projectId},project_id.eq.GLOBAL`
|
|
88
|
+
: `project_id.eq.${projectId}`;
|
|
89
|
+
const { data, error } = await supabase
|
|
90
|
+
.from("memory_chunks")
|
|
91
|
+
.select("id, content, file_origin, chunk_index, metadata, project_id")
|
|
92
|
+
.contains("metadata", { context_id: contextId })
|
|
93
|
+
.or(projectFilter)
|
|
94
|
+
.limit(Math.max(limit, 5));
|
|
95
|
+
if (error) {
|
|
96
|
+
throw new Error(`Supabase context_id-lookup failed: ${error.message}`);
|
|
97
|
+
}
|
|
98
|
+
const rows = (data ?? []);
|
|
99
|
+
return {
|
|
100
|
+
project_id: projectId,
|
|
101
|
+
query: args.query,
|
|
102
|
+
mode: "context_id",
|
|
103
|
+
include_global: includeGlobal,
|
|
104
|
+
count: rows.length,
|
|
105
|
+
results: rows.map((r) => ({
|
|
106
|
+
id: r.id,
|
|
107
|
+
content: r.content,
|
|
108
|
+
file_origin: r.file_origin,
|
|
109
|
+
chunk_index: r.chunk_index,
|
|
110
|
+
metadata: r.metadata,
|
|
111
|
+
similarity: 1.0,
|
|
112
|
+
project_id: r.project_id,
|
|
113
|
+
})),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (matches(ARCHIVE_PATTERNS, args.query)) {
|
|
117
|
+
const rows = await listArchive(projectId, { limit: Math.max(limit, 20) });
|
|
118
|
+
const summary = rows.length === 0
|
|
119
|
+
? "Archive is empty for this project."
|
|
120
|
+
: `${rows.length} archived task${rows.length === 1 ? "" : "s"}. Most recent: "${rows[0].title}" (archived ${rows[0].archived_at}).`;
|
|
121
|
+
return {
|
|
122
|
+
project_id: projectId,
|
|
123
|
+
query: args.query,
|
|
124
|
+
mode: "archive",
|
|
125
|
+
count: rows.length,
|
|
126
|
+
results: [],
|
|
127
|
+
archive: rows.map((t) => ({
|
|
128
|
+
id: t.id,
|
|
129
|
+
cloud_backlog_id: t.cloud_backlog_id,
|
|
130
|
+
title: t.title,
|
|
131
|
+
status: t.status,
|
|
132
|
+
priority: t.priority,
|
|
133
|
+
notes: t.notes,
|
|
134
|
+
created_at: t.created_at,
|
|
135
|
+
archived_at: t.archived_at,
|
|
136
|
+
})),
|
|
137
|
+
summary,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (matches(BACKLOG_PATTERNS, args.query)) {
|
|
141
|
+
const [inProg, todo, blocked] = await Promise.all([
|
|
142
|
+
listBacklog(projectId, { status: "in_progress" }),
|
|
143
|
+
listBacklog(projectId, { status: "todo" }),
|
|
144
|
+
listBacklog(projectId, { status: "blocked" }),
|
|
145
|
+
]);
|
|
146
|
+
const active = sortByPriorityThenAge([...inProg, ...todo, ...blocked]);
|
|
147
|
+
const top = active.slice(0, Math.max(limit, 20));
|
|
148
|
+
const head = active[0];
|
|
149
|
+
const summary = active.length === 0
|
|
150
|
+
? "Backlog is empty for this project."
|
|
151
|
+
: `${active.length} active task${active.length === 1 ? "" : "s"}. ` +
|
|
152
|
+
`Next: [P${head.priority}] ${head.title} (${head.status}).`;
|
|
153
|
+
return {
|
|
154
|
+
project_id: projectId,
|
|
155
|
+
query: args.query,
|
|
156
|
+
mode: "backlog",
|
|
157
|
+
count: top.length,
|
|
158
|
+
results: [],
|
|
159
|
+
backlog: top.map((t) => ({
|
|
160
|
+
id: t.id,
|
|
161
|
+
title: t.title,
|
|
162
|
+
status: t.status,
|
|
163
|
+
priority: t.priority,
|
|
164
|
+
notes: t.notes,
|
|
165
|
+
created_at: t.created_at,
|
|
166
|
+
})),
|
|
167
|
+
summary,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
// Default semantic path. Archived backlog rows are NEVER mixed into
|
|
171
|
+
// semantic results — they live in a different table and only surface via
|
|
172
|
+
// the archive-intent fast path above.
|
|
173
|
+
//
|
|
174
|
+
// `metadata_filter` (when present) flows through to match_memory_chunks's
|
|
175
|
+
// `p_metadata_filter` arg — the GIN(jsonb_path_ops) index narrows the
|
|
176
|
+
// candidate set BEFORE pgvector ranks. Project-id filtering is structural
|
|
177
|
+
// at the SQL level (first WHERE predicate) and is never relaxed.
|
|
178
|
+
const [queryVec] = await embed([args.query]);
|
|
179
|
+
const results = await searchChunks(projectId, queryVec, limit, args.min_similarity ?? 0.0, args.metadata_filter ?? null, includeGlobal);
|
|
180
|
+
return {
|
|
181
|
+
project_id: projectId,
|
|
182
|
+
query: args.query,
|
|
183
|
+
mode: "semantic",
|
|
184
|
+
include_global: includeGlobal,
|
|
185
|
+
count: results.length,
|
|
186
|
+
results,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|