fastrmemory 0.3.0 → 0.3.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/.claude-plugin/marketplace.json +14 -14
- package/.claude-plugin/plugin.json +18 -18
- package/.cursor/mcp.json +3 -1
- package/.cursor/skills/fastr-compress/SKILL.md +33 -33
- package/.cursor/skills/fastr-curate/SKILL.md +62 -62
- package/.cursor/skills/fastr-dag/SKILL.md +47 -47
- package/.cursor/skills/fastr-doctor/SKILL.md +39 -39
- package/.cursor/skills/fastr-memory/SKILL.md +51 -51
- package/.cursor/skills/fastr-plan-estimate/SKILL.md +45 -45
- package/.cursor/skills/fastr-session-commit/SKILL.md +49 -49
- package/.cursor/skills/fastr-setup/SKILL.md +45 -45
- package/.cursor/skills/fastr-trap-log/SKILL.md +39 -39
- package/.cursor/skills/fastr-vision/SKILL.md +35 -35
- package/.cursor/skills/skills.json +65 -65
- package/README.md +727 -729
- package/bin/fastr-guard.mjs +61 -0
- package/dist/bin/fastr.js +10 -9
- package/dist/bin/fastr.js.map +1 -1
- package/dist/src/bench/benchmark.js +13 -13
- package/dist/src/bench/harness.js +17 -17
- package/dist/src/bench/public-harness.js +5 -5
- package/dist/src/branch/manager.js +31 -31
- package/dist/src/ci/guardian.js +9 -9
- package/dist/src/db/doctor.js +25 -25
- package/dist/src/db/hygiene.js +23 -23
- package/dist/src/db/repository.js +283 -283
- package/dist/src/db/schema.js +268 -268
- package/dist/src/db/spool.js +4 -4
- package/dist/src/export/obsidian.js +15 -15
- package/dist/src/import/local.js +4 -4
- package/dist/src/installer/setup.d.ts +2 -0
- package/dist/src/installer/setup.d.ts.map +1 -1
- package/dist/src/installer/setup.js +24 -18
- package/dist/src/installer/setup.js.map +1 -1
- package/dist/src/mcp/server.js +25 -25
- package/dist/src/mirror/markdown-pages.js +22 -22
- package/dist/src/search/backfill.js +6 -6
- package/dist/src/search/hybrid-rrf.js +60 -60
- package/dist/src/ui/server.js +1259 -1259
- package/dist/src/vision/assets.js +6 -6
- package/dist-ui/assets/ActionsPage-B3quzFNF.js +11 -11
- package/dist-ui/assets/GraphPage-DetiATmC.js +1 -1
- package/dist-ui/assets/ObservatoryPage-QIGMwENf.js +16 -16
- package/dist-ui/assets/TreemapPage-C7uLZd37.js +2 -2
- package/dist-ui/assets/index-BJnPINTu.css +1 -1
- package/dist-ui/assets/index-DWAH--Fu.js +329 -329
- package/dist-ui/assets/maximize-2-BebkGbZA.js +6 -6
- package/dist-ui/build-manifest.json +95 -95
- package/dist-ui/index.html +26 -26
- package/llms-install.md +69 -69
- package/package.json +108 -107
- package/server.json +28 -28
- package/skills/fastr-compress/SKILL.md +33 -33
- package/skills/fastr-curate/SKILL.md +62 -62
- package/skills/fastr-dag/SKILL.md +47 -47
- package/skills/fastr-doctor/SKILL.md +39 -39
- package/skills/fastr-memory/SKILL.md +51 -51
- package/skills/fastr-plan-estimate/SKILL.md +45 -45
- package/skills/fastr-session-commit/SKILL.md +49 -49
- package/skills/fastr-setup/SKILL.md +45 -45
- package/skills/fastr-trap-log/SKILL.md +39 -39
- package/skills/fastr-vision/SKILL.md +35 -35
- package/skills/skills.json +65 -65
package/dist/src/db/doctor.js
CHANGED
|
@@ -37,14 +37,14 @@ export function diagnoseDatabase(db, projectId) {
|
|
|
37
37
|
const totalMemories = Number(totalRow?.c || 0);
|
|
38
38
|
const ftsRow = db.prepare('SELECT COUNT(*) as c FROM main.memories_fts').get();
|
|
39
39
|
ftsRowCount = Number(ftsRow?.c || 0);
|
|
40
|
-
const missingRow = db.prepare(`
|
|
41
|
-
SELECT COUNT(*) as c FROM main.memories m
|
|
42
|
-
WHERE NOT EXISTS (SELECT 1 FROM main.memories_fts f WHERE f.id = m.id)
|
|
40
|
+
const missingRow = db.prepare(`
|
|
41
|
+
SELECT COUNT(*) as c FROM main.memories m
|
|
42
|
+
WHERE NOT EXISTS (SELECT 1 FROM main.memories_fts f WHERE f.id = m.id)
|
|
43
43
|
`).get();
|
|
44
44
|
const missing = Number(missingRow?.c || 0);
|
|
45
|
-
const staleRow = db.prepare(`
|
|
46
|
-
SELECT COUNT(*) as c FROM main.memories_fts f
|
|
47
|
-
WHERE NOT EXISTS (SELECT 1 FROM main.memories m WHERE m.id = f.id)
|
|
45
|
+
const staleRow = db.prepare(`
|
|
46
|
+
SELECT COUNT(*) as c FROM main.memories_fts f
|
|
47
|
+
WHERE NOT EXISTS (SELECT 1 FROM main.memories m WHERE m.id = f.id)
|
|
48
48
|
`).get();
|
|
49
49
|
const stale = Number(staleRow?.c || 0);
|
|
50
50
|
const duplicates = Math.max(0, ftsRowCount - stale - (totalMemories - missing));
|
|
@@ -81,10 +81,10 @@ export function diagnoseDatabase(db, projectId) {
|
|
|
81
81
|
try {
|
|
82
82
|
const flRow = db.prepare('SELECT COUNT(*) as c FROM file_links').get();
|
|
83
83
|
fileLinkCount = Number(flRow?.c || 0);
|
|
84
|
-
const orphanRow = db.prepare(`
|
|
85
|
-
SELECT COUNT(*) as c
|
|
86
|
-
FROM file_links
|
|
87
|
-
WHERE memory_id NOT IN (SELECT id FROM memories)
|
|
84
|
+
const orphanRow = db.prepare(`
|
|
85
|
+
SELECT COUNT(*) as c
|
|
86
|
+
FROM file_links
|
|
87
|
+
WHERE memory_id NOT IN (SELECT id FROM memories)
|
|
88
88
|
`).get();
|
|
89
89
|
const orphanCount = Number(orphanRow?.c || 0);
|
|
90
90
|
if (orphanCount > 0) {
|
|
@@ -111,11 +111,11 @@ export function diagnoseDatabase(db, projectId) {
|
|
|
111
111
|
try {
|
|
112
112
|
const actRow = db.prepare('SELECT COUNT(*) as c FROM actions WHERE project_id = ?').get(projectId);
|
|
113
113
|
actionCount = Number(actRow?.c || 0);
|
|
114
|
-
const orphanEdges = db.prepare(`
|
|
115
|
-
SELECT COUNT(*) as c
|
|
116
|
-
FROM action_edges
|
|
117
|
-
WHERE source_action_id NOT IN (SELECT id FROM actions)
|
|
118
|
-
OR target_action_id NOT IN (SELECT id FROM actions)
|
|
114
|
+
const orphanEdges = db.prepare(`
|
|
115
|
+
SELECT COUNT(*) as c
|
|
116
|
+
FROM action_edges
|
|
117
|
+
WHERE source_action_id NOT IN (SELECT id FROM actions)
|
|
118
|
+
OR target_action_id NOT IN (SELECT id FROM actions)
|
|
119
119
|
`).get();
|
|
120
120
|
const orphanEdgeCount = Number(orphanEdges?.c || 0);
|
|
121
121
|
if (orphanEdgeCount > 0) {
|
|
@@ -193,9 +193,9 @@ export function healDatabase(db, projectId, options = {}) {
|
|
|
193
193
|
const linkIssue = reportBefore.issues.find(i => i.category === 'file_links');
|
|
194
194
|
if (linkIssue) {
|
|
195
195
|
try {
|
|
196
|
-
const res = db.prepare(`
|
|
197
|
-
DELETE FROM file_links
|
|
198
|
-
WHERE memory_id NOT IN (SELECT id FROM memories)
|
|
196
|
+
const res = db.prepare(`
|
|
197
|
+
DELETE FROM file_links
|
|
198
|
+
WHERE memory_id NOT IN (SELECT id FROM memories)
|
|
199
199
|
`).run();
|
|
200
200
|
const count = Number(res?.changes || linkIssue.affectedCount);
|
|
201
201
|
actionsTaken.push(`Pruned ${count} orphaned file_links.`);
|
|
@@ -209,10 +209,10 @@ export function healDatabase(db, projectId, options = {}) {
|
|
|
209
209
|
const actIssue = reportBefore.issues.find(i => i.category === 'actions');
|
|
210
210
|
if (actIssue) {
|
|
211
211
|
try {
|
|
212
|
-
const res = db.prepare(`
|
|
213
|
-
DELETE FROM action_edges
|
|
214
|
-
WHERE source_action_id NOT IN (SELECT id FROM actions)
|
|
215
|
-
OR target_action_id NOT IN (SELECT id FROM actions)
|
|
212
|
+
const res = db.prepare(`
|
|
213
|
+
DELETE FROM action_edges
|
|
214
|
+
WHERE source_action_id NOT IN (SELECT id FROM actions)
|
|
215
|
+
OR target_action_id NOT IN (SELECT id FROM actions)
|
|
216
216
|
`).run();
|
|
217
217
|
const count = Number(res?.changes || actIssue.affectedCount);
|
|
218
218
|
actionsTaken.push(`Pruned ${count} invalid action_edges across action DAG.`);
|
|
@@ -256,9 +256,9 @@ export function rebuildMemoriesFts(db) {
|
|
|
256
256
|
db.exec('BEGIN IMMEDIATE');
|
|
257
257
|
try {
|
|
258
258
|
db.exec('DELETE FROM main.memories_fts');
|
|
259
|
-
const res = db.prepare(`
|
|
260
|
-
INSERT INTO main.memories_fts (id, title, module, content)
|
|
261
|
-
SELECT id, title, module, content FROM main.memories
|
|
259
|
+
const res = db.prepare(`
|
|
260
|
+
INSERT INTO main.memories_fts (id, title, module, content)
|
|
261
|
+
SELECT id, title, module, content FROM main.memories
|
|
262
262
|
`).run();
|
|
263
263
|
db.exec('COMMIT');
|
|
264
264
|
return Number(res.changes);
|
package/dist/src/db/hygiene.js
CHANGED
|
@@ -24,43 +24,43 @@ export function inspectMemoryHygiene(db, projectId, options = {}) {
|
|
|
24
24
|
const staleAfterDays = Math.max(1, Math.floor(options.staleAfterDays ?? DEFAULT_STALE_AFTER_DAYS));
|
|
25
25
|
const now = options.now ?? new Date();
|
|
26
26
|
const cutoff = new Date(now.getTime() - staleAfterDays * 86_400_000).toISOString();
|
|
27
|
-
const activeMemories = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
27
|
+
const activeMemories = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
28
28
|
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}`, projectId);
|
|
29
|
-
const pinnedMemories = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
29
|
+
const pinnedMemories = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
30
30
|
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES} AND pinned = 1`, projectId);
|
|
31
|
-
const neverRecalled = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
32
|
-
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
31
|
+
const neverRecalled = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
32
|
+
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
33
33
|
AND (last_recalled_at IS NULL OR last_recalled_at = '')`, projectId);
|
|
34
34
|
const orphanFileLinks = tableExists(db, 'file_links')
|
|
35
|
-
? count(db, `SELECT COUNT(*) AS c FROM file_links
|
|
35
|
+
? count(db, `SELECT COUNT(*) AS c FROM file_links
|
|
36
36
|
WHERE memory_id NOT IN (SELECT id FROM memories)`)
|
|
37
37
|
: 0;
|
|
38
38
|
const orphanConflicts = tableExists(db, 'memory_conflicts')
|
|
39
|
-
? count(db, `SELECT COUNT(*) AS c FROM memory_conflicts
|
|
40
|
-
WHERE memory_a_id NOT IN (SELECT id FROM memories)
|
|
39
|
+
? count(db, `SELECT COUNT(*) AS c FROM memory_conflicts
|
|
40
|
+
WHERE memory_a_id NOT IN (SELECT id FROM memories)
|
|
41
41
|
OR memory_b_id NOT IN (SELECT id FROM memories)`)
|
|
42
42
|
: 0;
|
|
43
43
|
const orphanFeedback = tableExists(db, 'memory_feedback')
|
|
44
|
-
? count(db, `SELECT COUNT(*) AS c FROM memory_feedback
|
|
44
|
+
? count(db, `SELECT COUNT(*) AS c FROM memory_feedback
|
|
45
45
|
WHERE memory_id NOT IN (SELECT id FROM memories)`)
|
|
46
46
|
: 0;
|
|
47
|
-
const duplicateTitleGroups = db.prepare(`
|
|
48
|
-
SELECT module, kind, lower(trim(title)) AS normalized_title, COUNT(*) AS count
|
|
49
|
-
FROM memories
|
|
50
|
-
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
51
|
-
GROUP BY module, kind, lower(trim(title))
|
|
52
|
-
HAVING COUNT(*) > 1
|
|
47
|
+
const duplicateTitleGroups = db.prepare(`
|
|
48
|
+
SELECT module, kind, lower(trim(title)) AS normalized_title, COUNT(*) AS count
|
|
49
|
+
FROM memories
|
|
50
|
+
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
51
|
+
GROUP BY module, kind, lower(trim(title))
|
|
52
|
+
HAVING COUNT(*) > 1
|
|
53
53
|
`).all(projectId);
|
|
54
|
-
const duplicateContentGroups = db.prepare(`
|
|
55
|
-
SELECT module, kind, content, COUNT(*) AS count
|
|
56
|
-
FROM memories
|
|
57
|
-
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
58
|
-
GROUP BY module, kind, content
|
|
59
|
-
HAVING COUNT(*) > 1
|
|
54
|
+
const duplicateContentGroups = db.prepare(`
|
|
55
|
+
SELECT module, kind, content, COUNT(*) AS count
|
|
56
|
+
FROM memories
|
|
57
|
+
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
58
|
+
GROUP BY module, kind, content
|
|
59
|
+
HAVING COUNT(*) > 1
|
|
60
60
|
`).all(projectId);
|
|
61
|
-
const staleMemories = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
62
|
-
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
63
|
-
AND pinned = 0
|
|
61
|
+
const staleMemories = count(db, `SELECT COUNT(*) AS c FROM memories
|
|
62
|
+
WHERE project_id = ? AND valid_to IS NULL AND status IN ${ACTIVE_STATUSES}
|
|
63
|
+
AND pinned = 0
|
|
64
64
|
AND COALESCE(NULLIF(last_recalled_at, ''), created_at) < ?`, projectId, cutoff);
|
|
65
65
|
const duplicateTitleRows = sumExtraRows(duplicateTitleGroups);
|
|
66
66
|
const duplicateContentRows = sumExtraRows(duplicateContentGroups);
|