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.
Files changed (63) hide show
  1. package/.claude-plugin/marketplace.json +14 -14
  2. package/.claude-plugin/plugin.json +18 -18
  3. package/.cursor/mcp.json +3 -1
  4. package/.cursor/skills/fastr-compress/SKILL.md +33 -33
  5. package/.cursor/skills/fastr-curate/SKILL.md +62 -62
  6. package/.cursor/skills/fastr-dag/SKILL.md +47 -47
  7. package/.cursor/skills/fastr-doctor/SKILL.md +39 -39
  8. package/.cursor/skills/fastr-memory/SKILL.md +51 -51
  9. package/.cursor/skills/fastr-plan-estimate/SKILL.md +45 -45
  10. package/.cursor/skills/fastr-session-commit/SKILL.md +49 -49
  11. package/.cursor/skills/fastr-setup/SKILL.md +45 -45
  12. package/.cursor/skills/fastr-trap-log/SKILL.md +39 -39
  13. package/.cursor/skills/fastr-vision/SKILL.md +35 -35
  14. package/.cursor/skills/skills.json +65 -65
  15. package/README.md +727 -729
  16. package/bin/fastr-guard.mjs +61 -0
  17. package/dist/bin/fastr.js +10 -9
  18. package/dist/bin/fastr.js.map +1 -1
  19. package/dist/src/bench/benchmark.js +13 -13
  20. package/dist/src/bench/harness.js +17 -17
  21. package/dist/src/bench/public-harness.js +5 -5
  22. package/dist/src/branch/manager.js +31 -31
  23. package/dist/src/ci/guardian.js +9 -9
  24. package/dist/src/db/doctor.js +25 -25
  25. package/dist/src/db/hygiene.js +23 -23
  26. package/dist/src/db/repository.js +283 -283
  27. package/dist/src/db/schema.js +268 -268
  28. package/dist/src/db/spool.js +4 -4
  29. package/dist/src/export/obsidian.js +15 -15
  30. package/dist/src/import/local.js +4 -4
  31. package/dist/src/installer/setup.d.ts +2 -0
  32. package/dist/src/installer/setup.d.ts.map +1 -1
  33. package/dist/src/installer/setup.js +24 -18
  34. package/dist/src/installer/setup.js.map +1 -1
  35. package/dist/src/mcp/server.js +25 -25
  36. package/dist/src/mirror/markdown-pages.js +22 -22
  37. package/dist/src/search/backfill.js +6 -6
  38. package/dist/src/search/hybrid-rrf.js +60 -60
  39. package/dist/src/ui/server.js +1259 -1259
  40. package/dist/src/vision/assets.js +6 -6
  41. package/dist-ui/assets/ActionsPage-B3quzFNF.js +11 -11
  42. package/dist-ui/assets/GraphPage-DetiATmC.js +1 -1
  43. package/dist-ui/assets/ObservatoryPage-QIGMwENf.js +16 -16
  44. package/dist-ui/assets/TreemapPage-C7uLZd37.js +2 -2
  45. package/dist-ui/assets/index-BJnPINTu.css +1 -1
  46. package/dist-ui/assets/index-DWAH--Fu.js +329 -329
  47. package/dist-ui/assets/maximize-2-BebkGbZA.js +6 -6
  48. package/dist-ui/build-manifest.json +95 -95
  49. package/dist-ui/index.html +26 -26
  50. package/llms-install.md +69 -69
  51. package/package.json +108 -107
  52. package/server.json +28 -28
  53. package/skills/fastr-compress/SKILL.md +33 -33
  54. package/skills/fastr-curate/SKILL.md +62 -62
  55. package/skills/fastr-dag/SKILL.md +47 -47
  56. package/skills/fastr-doctor/SKILL.md +39 -39
  57. package/skills/fastr-memory/SKILL.md +51 -51
  58. package/skills/fastr-plan-estimate/SKILL.md +45 -45
  59. package/skills/fastr-session-commit/SKILL.md +49 -49
  60. package/skills/fastr-setup/SKILL.md +45 -45
  61. package/skills/fastr-trap-log/SKILL.md +39 -39
  62. package/skills/fastr-vision/SKILL.md +35 -35
  63. package/skills/skills.json +65 -65
@@ -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);
@@ -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);