feat: Import/Migration from thedotmack/claude-mem (Legacy System) #198

Closed
opened 2026-01-24 17:06:33 +00:00 by jack · 1 comment
Owner

Zusammenfassung

Ermögliche die Migration von Daten aus dem ursprünglichen thedotmack/claude-mem System in unseren Fork. Dies erlaubt Nutzern, ihre bestehenden Memories zu übernehmen.


Hintergrund

Das originale thedotmack/claude-mem hat ein anderes Datenbank-Schema. Nutzer, die von dort zu unserem Fork wechseln, sollten ihre gesammelten Observations und Sessions mitnehmen können.

Lokale Legacy-Installation: jack/claude-mem-fork auf Forgejo (enthält ~45 Issues mit Customizations)


Abhängigkeiten

Dieses Issue kann erst umgesetzt werden, wenn folgende Issues abgeschlossen sind:

Issue Titel Grund
#197 Database Schema Redesign Stabiles Ziel-Schema für Migration
#108 Vision 2026 - Knowledge Platform Klare Richtung für Datenstrukturen
#112 Provider-Agnostic Architecture Embedding/Vector-DB Abstraktion für Import

Funktionsumfang

1. CLI Tool (Standalone)

Eigenständiges CLI-Tool das ohne laufenden Backend-Server funktioniert:

# Installation (falls separat)
npm install -g @claude-mem/migrate

# Oder direkt via npx
npx @claude-mem/migrate analyze /path/to/legacy.db

Befehle

# Schema analysieren
claude-mem-migrate analyze <source-db>
claude-mem-migrate analyze ~/.claude-mem-old/claude-mem.db

# Dry-run (zeigt was passieren würde, ändert nichts)
claude-mem-migrate import <source-db> --dry-run
claude-mem-migrate import ~/.claude-mem-old/claude-mem.db --dry-run

# Tatsächlicher Import
claude-mem-migrate import <source-db> [--target <target-db>]
claude-mem-migrate import ~/.claude-mem-old/claude-mem.db
claude-mem-migrate import ~/.claude-mem-old/claude-mem.db --target ~/.claude-mem/claude-mem.db

# Mit Optionen
claude-mem-migrate import <source-db> \
  --project-map "old-project:new-project" \
  --skip-embeddings \
  --conflict-strategy skip|overwrite|merge \
  --verbose

# Hilfe
claude-mem-migrate --help
claude-mem-migrate import --help

Beispiel-Output: Analyze

$ claude-mem-migrate analyze ~/.claude-mem-old/claude-mem.db

╔══════════════════════════════════════════════════════════════╗
║              Legacy Database Analysis                         ║
╠══════════════════════════════════════════════════════════════╣
║ Source: /home/user/.claude-mem-old/claude-mem.db             ║
║ Format: thedotmack/claude-mem v1.x                           ║
║ Size:   42.3 MB                                              ║
╚══════════════════════════════════════════════════════════════╝

Tables Found:
┌─────────────────┬────────────┬─────────────────────────────┐
│ Table           │ Rows       │ Notes                       │
├─────────────────┼────────────┼─────────────────────────────┤
│ memories        │ 5,234      │ → observations              │
│ sessions        │ 892        │ → sessions (partial)        │
│ embeddings      │ 5,234      │ Qdrant IDs (re-generate)    │
└─────────────────┴────────────┴─────────────────────────────┘

Schema Differences:
  • memories.content → observations.text
  • memories.type: different enum values (will be mapped)
  • sessions: missing working_directory (will be NULL)
  • No user_prompts table (will be skipped)

Projects Found:
  • docubuild (2,341 memories)
  • customable (1,893 memories)
  • personal (1,000 memories)

Estimated Migration:
  ✓ 5,234 observations (with type mapping)
  ✓ 892 sessions (partial data)
  ⚠ Embeddings: require re-generation (optional)

Run 'claude-mem-migrate import <source-db> --dry-run' to preview changes.

Beispiel-Output: Import

$ claude-mem-migrate import ~/.claude-mem-old/claude-mem.db --dry-run

╔══════════════════════════════════════════════════════════════╗
║              Migration Preview (Dry Run)                      ║
╚══════════════════════════════════════════════════════════════╝

Source: /home/user/.claude-mem-old/claude-mem.db
Target: /home/user/.claude-mem/claude-mem.db

Actions to perform:
  [CREATE] 5,234 observations
  [CREATE] 892 sessions
  [SKIP]   3 sessions (already exist)
  [SKIP]   embeddings (--skip-embeddings)

Type Mappings:
  memory   → discovery (2,100 records)
  insight  → discovery (890 records)
  decision → decision (1,244 records)
  learning → discovery (500 records)
  bug      → bugfix (300 records)
  feature  → feature (200 records)

⚠ No changes made (dry run). Remove --dry-run to execute.
$ claude-mem-migrate import ~/.claude-mem-old/claude-mem.db

╔══════════════════════════════════════════════════════════════╗
║              Migrating Legacy Data                            ║
╚══════════════════════════════════════════════════════════════╝

[1/4] Creating backup...
      ✓ Backup saved to ~/.claude-mem/claude-mem.db.backup-20260125

[2/4] Migrating sessions...
      ████████████████████████████████████████ 100%
      ✓ 892 sessions migrated, 3 skipped (existing)

[3/4] Migrating observations...
      ████████████████████████████████████████ 100%
      ✓ 5,234 observations migrated

[4/4] Updating indexes...
      ✓ FTS5 indexes rebuilt

╔══════════════════════════════════════════════════════════════╗
║              Migration Complete                               ║
╠══════════════════════════════════════════════════════════════╣
║ Sessions:     892 created, 3 skipped                         ║
║ Observations: 5,234 created                                  ║
║ Duration:     12.3 seconds                                   ║
║ Backup:       ~/.claude-mem/claude-mem.db.backup-20260125    ║
╚══════════════════════════════════════════════════════════════╝

💡 Run 'claude-mem-migrate embeddings' to generate vector embeddings
   for semantic search (optional, requires running worker).

2. Konflikt-Handling (Interaktiv)

$ claude-mem-migrate import ~/.claude-mem-old/claude-mem.db

⚠ Conflicts Detected

3 sessions already exist with matching IDs:

  ID              │ Existing (Target)      │ Incoming (Source)
  ────────────────┼────────────────────────┼────────────────────
  session_abc123  │ Jan 15, 2025 (5 obs)   │ Jan 15, 2025 (8 obs)
  session_def456  │ Jan 18, 2025 (3 obs)   │ Jan 18, 2025 (3 obs)
  session_ghi789  │ Jan 20, 2025 (12 obs)  │ Jan 20, 2025 (15 obs)

How should conflicts be handled?

  [s] Skip existing - keep target data, ignore source
  [o] Overwrite - replace target with source
  [m] Merge - combine observations from both
  [a] Abort - cancel migration

Choice [s/o/m/a]: 

3. WebUI Import (Optional)

Zusätzlich zur CLI auch ein Import-Dialog im WebUI:

┌─ Import Legacy Data ────────────────────────────┐
│                                                 │
│ Source: [Choose file...] legacy.db              │
│                                                 │
│ ☑ Import observations                           │
│ ☑ Import sessions                               │
│ ☐ Re-generate embeddings (slow)                 │
│ ☑ Map project names                             │
│                                                 │
│ Project Mapping:                                │
│ ┌─────────────────┬─────────────────┐          │
│ │ Legacy          │ New             │          │
│ ├─────────────────┼─────────────────┤          │
│ │ my-project      │ my-project      │          │
│ │ old-name        │ [new-name    ]  │          │
│ └─────────────────┴─────────────────┘          │
│                                                 │
│ [Preview] [Import] [Cancel]                     │
└─────────────────────────────────────────────────┘

Schema-Mapping

thedotmack/claude-mem → customable/claude-mem

Legacy Tabelle Legacy Spalte Neue Tabelle Neue Spalte Transformation
memories id observations id Auto-increment neu
memories session_id observations memory_session_id Direct
memories content observations text Direct
memories type observations type Enum mapping
memories metadata observations concepts, facts JSON extract
memories created_at observations created_at Direct
sessions id sessions memory_session_id Direct
sessions project sessions project Direct
sessions started_at sessions started_at Direct
- - observations working_directory NULL or infer
- - observations repo_path NULL or infer

Type Enum Mapping

Legacy Type Neuer Type
memory discovery
insight discovery
decision decision
learning discovery
bug bugfix
feature feature
refactor refactor

Technische Implementierung

Neues Package: @claude-mem/migrate

packages/migrate/
├── package.json
├── tsconfig.json
├── src/
│   ├── index.ts              # CLI entry point
│   ├── cli.ts                # Commander.js setup
│   ├── commands/
│   │   ├── analyze.ts        # analyze command
│   │   ├── import.ts         # import command
│   │   └── embeddings.ts     # embeddings regeneration
│   ├── analyzers/
│   │   ├── base.ts           # Base analyzer interface
│   │   └── thedotmack-v1.ts  # thedotmack schema analyzer
│   ├── importers/
│   │   ├── base.ts           # Base importer interface
│   │   └── thedotmack-v1.ts  # thedotmack importer
│   ├── utils/
│   │   ├── backup.ts         # Backup utilities
│   │   ├── progress.ts       # Progress bar (ora/cli-progress)
│   │   └── prompts.ts        # Interactive prompts (inquirer)
│   └── types.ts
└── bin/
    └── claude-mem-migrate    # Executable

Backend API (für WebUI)

// packages/backend/src/routes/migration.ts

// POST /api/migration/analyze
// Body: { dbPath: string }
// Response: { tables: [], rowCounts: {}, differences: [], estimate: {} }

// POST /api/migration/import
// Body: { dbPath: string, options: ImportOptions }
// Response: { imported: { observations: number, sessions: number }, errors: [] }

// POST /api/migration/import-file
// Multipart form mit SQLite-Datei

Embedding-Handling

Legacy-System nutzte möglicherweise andere Embedding-Modelle. Optionen:

  1. Re-generate (empfohlen): Alle Embeddings neu erstellen mit aktuellem Provider
  2. Skip: Keine Vector-Search für importierte Daten
  3. Import (experimentell): Falls Dimensionen kompatibel
# Nach Import: Embeddings generieren (benötigt laufenden Worker)
claude-mem-migrate embeddings --source legacy
claude-mem-migrate embeddings --all  # Alle ohne Embedding

Akzeptanzkriterien

  • CLI-Tool claude-mem-migrate als eigenständiges Package
  • analyze Befehl zeigt Schema-Unterschiede
  • import --dry-run zeigt Preview ohne Änderungen
  • import migriert alle Daten korrekt
  • Interaktives Konflikt-Handling funktioniert
  • --conflict-strategy Flag für nicht-interaktiven Modus
  • Automatisches Backup vor Import
  • WebUI Import-Dialog (optional)
  • Embeddings können nachträglich generiert werden
  • Dokumentation für Migration vorhanden

CLI-Optionen Übersicht

claude-mem-migrate analyze <source>
  Analyze a legacy database and show migration preview

  Arguments:
    source              Path to legacy SQLite database

  Options:
    -f, --format <fmt>  Output format: text, json (default: text)
    -v, --verbose       Show detailed schema comparison

claude-mem-migrate import <source>
  Import data from a legacy database

  Arguments:
    source              Path to legacy SQLite database

  Options:
    -t, --target <path>           Target database (default: ~/.claude-mem/claude-mem.db)
    -n, --dry-run                 Preview changes without executing
    -p, --project-map <mapping>   Map project names (old:new,old2:new2)
    -c, --conflict <strategy>     Conflict strategy: skip, overwrite, merge (default: ask)
    -s, --skip-embeddings         Don't queue embedding generation
    -b, --no-backup               Skip automatic backup (not recommended)
    -v, --verbose                 Show detailed progress
    -y, --yes                     Skip confirmation prompts

claude-mem-migrate embeddings
  Generate embeddings for imported observations

  Options:
    --source <name>     Only process observations from specific import
    --all               Process all observations without embeddings
    --batch-size <n>    Batch size for processing (default: 100)

Offene Fragen

  1. Sollen wir auch andere Forks unterstützen oder nur thedotmack original?
  2. Soll der Import auch über HTTP (Remote-DB) möglich sein?
  3. Wie gehen wir mit Qdrant-Vektoren aus dem Legacy-System um?

Referenzen

## Zusammenfassung Ermögliche die Migration von Daten aus dem ursprünglichen `thedotmack/claude-mem` System in unseren Fork. Dies erlaubt Nutzern, ihre bestehenden Memories zu übernehmen. --- ## Hintergrund Das originale `thedotmack/claude-mem` hat ein anderes Datenbank-Schema. Nutzer, die von dort zu unserem Fork wechseln, sollten ihre gesammelten Observations und Sessions mitnehmen können. **Lokale Legacy-Installation:** `jack/claude-mem-fork` auf Forgejo (enthält ~45 Issues mit Customizations) --- ## Abhängigkeiten Dieses Issue kann erst umgesetzt werden, wenn folgende Issues abgeschlossen sind: | Issue | Titel | Grund | |-------|-------|-------| | **#197** | Database Schema Redesign | Stabiles Ziel-Schema für Migration | | **#108** | Vision 2026 - Knowledge Platform | Klare Richtung für Datenstrukturen | | **#112** | Provider-Agnostic Architecture | Embedding/Vector-DB Abstraktion für Import | --- ## Funktionsumfang ### 1. CLI Tool (Standalone) Eigenständiges CLI-Tool das ohne laufenden Backend-Server funktioniert: ```bash # Installation (falls separat) npm install -g @claude-mem/migrate # Oder direkt via npx npx @claude-mem/migrate analyze /path/to/legacy.db ``` #### Befehle ```bash # Schema analysieren claude-mem-migrate analyze <source-db> claude-mem-migrate analyze ~/.claude-mem-old/claude-mem.db # Dry-run (zeigt was passieren würde, ändert nichts) claude-mem-migrate import <source-db> --dry-run claude-mem-migrate import ~/.claude-mem-old/claude-mem.db --dry-run # Tatsächlicher Import claude-mem-migrate import <source-db> [--target <target-db>] claude-mem-migrate import ~/.claude-mem-old/claude-mem.db claude-mem-migrate import ~/.claude-mem-old/claude-mem.db --target ~/.claude-mem/claude-mem.db # Mit Optionen claude-mem-migrate import <source-db> \ --project-map "old-project:new-project" \ --skip-embeddings \ --conflict-strategy skip|overwrite|merge \ --verbose # Hilfe claude-mem-migrate --help claude-mem-migrate import --help ``` #### Beispiel-Output: Analyze ``` $ claude-mem-migrate analyze ~/.claude-mem-old/claude-mem.db ╔══════════════════════════════════════════════════════════════╗ ║ Legacy Database Analysis ║ ╠══════════════════════════════════════════════════════════════╣ ║ Source: /home/user/.claude-mem-old/claude-mem.db ║ ║ Format: thedotmack/claude-mem v1.x ║ ║ Size: 42.3 MB ║ ╚══════════════════════════════════════════════════════════════╝ Tables Found: ┌─────────────────┬────────────┬─────────────────────────────┐ │ Table │ Rows │ Notes │ ├─────────────────┼────────────┼─────────────────────────────┤ │ memories │ 5,234 │ → observations │ │ sessions │ 892 │ → sessions (partial) │ │ embeddings │ 5,234 │ Qdrant IDs (re-generate) │ └─────────────────┴────────────┴─────────────────────────────┘ Schema Differences: • memories.content → observations.text • memories.type: different enum values (will be mapped) • sessions: missing working_directory (will be NULL) • No user_prompts table (will be skipped) Projects Found: • docubuild (2,341 memories) • customable (1,893 memories) • personal (1,000 memories) Estimated Migration: ✓ 5,234 observations (with type mapping) ✓ 892 sessions (partial data) ⚠ Embeddings: require re-generation (optional) Run 'claude-mem-migrate import <source-db> --dry-run' to preview changes. ``` #### Beispiel-Output: Import ``` $ claude-mem-migrate import ~/.claude-mem-old/claude-mem.db --dry-run ╔══════════════════════════════════════════════════════════════╗ ║ Migration Preview (Dry Run) ║ ╚══════════════════════════════════════════════════════════════╝ Source: /home/user/.claude-mem-old/claude-mem.db Target: /home/user/.claude-mem/claude-mem.db Actions to perform: [CREATE] 5,234 observations [CREATE] 892 sessions [SKIP] 3 sessions (already exist) [SKIP] embeddings (--skip-embeddings) Type Mappings: memory → discovery (2,100 records) insight → discovery (890 records) decision → decision (1,244 records) learning → discovery (500 records) bug → bugfix (300 records) feature → feature (200 records) ⚠ No changes made (dry run). Remove --dry-run to execute. ``` ``` $ claude-mem-migrate import ~/.claude-mem-old/claude-mem.db ╔══════════════════════════════════════════════════════════════╗ ║ Migrating Legacy Data ║ ╚══════════════════════════════════════════════════════════════╝ [1/4] Creating backup... ✓ Backup saved to ~/.claude-mem/claude-mem.db.backup-20260125 [2/4] Migrating sessions... ████████████████████████████████████████ 100% ✓ 892 sessions migrated, 3 skipped (existing) [3/4] Migrating observations... ████████████████████████████████████████ 100% ✓ 5,234 observations migrated [4/4] Updating indexes... ✓ FTS5 indexes rebuilt ╔══════════════════════════════════════════════════════════════╗ ║ Migration Complete ║ ╠══════════════════════════════════════════════════════════════╣ ║ Sessions: 892 created, 3 skipped ║ ║ Observations: 5,234 created ║ ║ Duration: 12.3 seconds ║ ║ Backup: ~/.claude-mem/claude-mem.db.backup-20260125 ║ ╚══════════════════════════════════════════════════════════════╝ 💡 Run 'claude-mem-migrate embeddings' to generate vector embeddings for semantic search (optional, requires running worker). ``` ### 2. Konflikt-Handling (Interaktiv) ``` $ claude-mem-migrate import ~/.claude-mem-old/claude-mem.db ⚠ Conflicts Detected 3 sessions already exist with matching IDs: ID │ Existing (Target) │ Incoming (Source) ────────────────┼────────────────────────┼──────────────────── session_abc123 │ Jan 15, 2025 (5 obs) │ Jan 15, 2025 (8 obs) session_def456 │ Jan 18, 2025 (3 obs) │ Jan 18, 2025 (3 obs) session_ghi789 │ Jan 20, 2025 (12 obs) │ Jan 20, 2025 (15 obs) How should conflicts be handled? [s] Skip existing - keep target data, ignore source [o] Overwrite - replace target with source [m] Merge - combine observations from both [a] Abort - cancel migration Choice [s/o/m/a]: ``` ### 3. WebUI Import (Optional) Zusätzlich zur CLI auch ein Import-Dialog im WebUI: ``` ┌─ Import Legacy Data ────────────────────────────┐ │ │ │ Source: [Choose file...] legacy.db │ │ │ │ ☑ Import observations │ │ ☑ Import sessions │ │ ☐ Re-generate embeddings (slow) │ │ ☑ Map project names │ │ │ │ Project Mapping: │ │ ┌─────────────────┬─────────────────┐ │ │ │ Legacy │ New │ │ │ ├─────────────────┼─────────────────┤ │ │ │ my-project │ my-project │ │ │ │ old-name │ [new-name ] │ │ │ └─────────────────┴─────────────────┘ │ │ │ │ [Preview] [Import] [Cancel] │ └─────────────────────────────────────────────────┘ ``` --- ## Schema-Mapping ### thedotmack/claude-mem → customable/claude-mem | Legacy Tabelle | Legacy Spalte | Neue Tabelle | Neue Spalte | Transformation | |----------------|---------------|--------------|-------------|----------------| | `memories` | `id` | `observations` | `id` | Auto-increment neu | | `memories` | `session_id` | `observations` | `memory_session_id` | Direct | | `memories` | `content` | `observations` | `text` | Direct | | `memories` | `type` | `observations` | `type` | Enum mapping | | `memories` | `metadata` | `observations` | `concepts`, `facts` | JSON extract | | `memories` | `created_at` | `observations` | `created_at` | Direct | | `sessions` | `id` | `sessions` | `memory_session_id` | Direct | | `sessions` | `project` | `sessions` | `project` | Direct | | `sessions` | `started_at` | `sessions` | `started_at` | Direct | | - | - | `observations` | `working_directory` | NULL or infer | | - | - | `observations` | `repo_path` | NULL or infer | ### Type Enum Mapping | Legacy Type | Neuer Type | |-------------|------------| | `memory` | `discovery` | | `insight` | `discovery` | | `decision` | `decision` | | `learning` | `discovery` | | `bug` | `bugfix` | | `feature` | `feature` | | `refactor` | `refactor` | --- ## Technische Implementierung ### Neues Package: `@claude-mem/migrate` ``` packages/migrate/ ├── package.json ├── tsconfig.json ├── src/ │ ├── index.ts # CLI entry point │ ├── cli.ts # Commander.js setup │ ├── commands/ │ │ ├── analyze.ts # analyze command │ │ ├── import.ts # import command │ │ └── embeddings.ts # embeddings regeneration │ ├── analyzers/ │ │ ├── base.ts # Base analyzer interface │ │ └── thedotmack-v1.ts # thedotmack schema analyzer │ ├── importers/ │ │ ├── base.ts # Base importer interface │ │ └── thedotmack-v1.ts # thedotmack importer │ ├── utils/ │ │ ├── backup.ts # Backup utilities │ │ ├── progress.ts # Progress bar (ora/cli-progress) │ │ └── prompts.ts # Interactive prompts (inquirer) │ └── types.ts └── bin/ └── claude-mem-migrate # Executable ``` ### Backend API (für WebUI) ```typescript // packages/backend/src/routes/migration.ts // POST /api/migration/analyze // Body: { dbPath: string } // Response: { tables: [], rowCounts: {}, differences: [], estimate: {} } // POST /api/migration/import // Body: { dbPath: string, options: ImportOptions } // Response: { imported: { observations: number, sessions: number }, errors: [] } // POST /api/migration/import-file // Multipart form mit SQLite-Datei ``` --- ## Embedding-Handling Legacy-System nutzte möglicherweise andere Embedding-Modelle. Optionen: 1. **Re-generate (empfohlen):** Alle Embeddings neu erstellen mit aktuellem Provider 2. **Skip:** Keine Vector-Search für importierte Daten 3. **Import (experimentell):** Falls Dimensionen kompatibel ```bash # Nach Import: Embeddings generieren (benötigt laufenden Worker) claude-mem-migrate embeddings --source legacy claude-mem-migrate embeddings --all # Alle ohne Embedding ``` --- ## Akzeptanzkriterien - [ ] CLI-Tool `claude-mem-migrate` als eigenständiges Package - [ ] `analyze` Befehl zeigt Schema-Unterschiede - [ ] `import --dry-run` zeigt Preview ohne Änderungen - [ ] `import` migriert alle Daten korrekt - [ ] Interaktives Konflikt-Handling funktioniert - [ ] `--conflict-strategy` Flag für nicht-interaktiven Modus - [ ] Automatisches Backup vor Import - [ ] WebUI Import-Dialog (optional) - [ ] Embeddings können nachträglich generiert werden - [ ] Dokumentation für Migration vorhanden --- ## CLI-Optionen Übersicht ``` claude-mem-migrate analyze <source> Analyze a legacy database and show migration preview Arguments: source Path to legacy SQLite database Options: -f, --format <fmt> Output format: text, json (default: text) -v, --verbose Show detailed schema comparison claude-mem-migrate import <source> Import data from a legacy database Arguments: source Path to legacy SQLite database Options: -t, --target <path> Target database (default: ~/.claude-mem/claude-mem.db) -n, --dry-run Preview changes without executing -p, --project-map <mapping> Map project names (old:new,old2:new2) -c, --conflict <strategy> Conflict strategy: skip, overwrite, merge (default: ask) -s, --skip-embeddings Don't queue embedding generation -b, --no-backup Skip automatic backup (not recommended) -v, --verbose Show detailed progress -y, --yes Skip confirmation prompts claude-mem-migrate embeddings Generate embeddings for imported observations Options: --source <name> Only process observations from specific import --all Process all observations without embeddings --batch-size <n> Batch size for processing (default: 100) ``` --- ## Offene Fragen 1. Sollen wir auch andere Forks unterstützen oder nur thedotmack original? 2. Soll der Import auch über HTTP (Remote-DB) möglich sein? 3. Wie gehen wir mit Qdrant-Vektoren aus dem Legacy-System um? --- ## Referenzen - Legacy-Repo: https://github.com/thedotmack/claude-mem - Lokaler Fork: `jack/claude-mem-fork` auf Forgejo
Author
Owner

Implementation Complete

Added migration tools to import data from thedotmack/claude-mem (the original fork).

New CLI Commands

# Analyze a legacy database (read-only)
claude-mem-backend migrate analyze <source-db>
claude-mem-backend migrate analyze ~/.claude-mem-old/claude-mem.db --json

# Import with dry-run (no changes)
claude-mem-backend migrate import <source-db> --dry-run

# Import with options
claude-mem-backend migrate import <source-db> --conflict skip      # skip existing (default)
claude-mem-backend migrate import <source-db> --conflict overwrite # overwrite existing
claude-mem-backend migrate import <source-db> --no-backup          # skip backup
claude-mem-backend migrate import <source-db> --project myproject  # filter by project

Files Created

File Purpose
packages/backend/src/migrate/type-mapper.ts Maps legacy types (memory, insight, learning) → current ObservationType
packages/backend/src/migrate/backup.ts Creates timestamped backups before migration
packages/backend/src/migrate/analyzer.ts Analyzes legacy schema (tables, types, projects, date range)
packages/backend/src/migrate/importer.ts Imports sessions and observations with conflict handling
packages/backend/src/migrate/index.ts Module re-exports

Type Mapping

Legacy types are automatically mapped to current ObservationType:

Legacy Current
memory, insight, learning discovery
decision, architectural_decision decision
bug, bugfix, fix bugfix
feature feature
refactor refactor
docs, documentation docs
note, bookmark note
task, todo task
(unknown) note

Features

  • Automatic backup: Creates timestamped backup before import (can disable with --no-backup)
  • Dry-run mode: Analyze without making changes
  • Conflict resolution: Skip or overwrite existing records
  • Project filtering: Import only from specific projects
  • JSON output: Machine-readable output with --json
  • Progress logging: Reports import statistics
## Implementation Complete Added migration tools to import data from thedotmack/claude-mem (the original fork). ### New CLI Commands ```bash # Analyze a legacy database (read-only) claude-mem-backend migrate analyze <source-db> claude-mem-backend migrate analyze ~/.claude-mem-old/claude-mem.db --json # Import with dry-run (no changes) claude-mem-backend migrate import <source-db> --dry-run # Import with options claude-mem-backend migrate import <source-db> --conflict skip # skip existing (default) claude-mem-backend migrate import <source-db> --conflict overwrite # overwrite existing claude-mem-backend migrate import <source-db> --no-backup # skip backup claude-mem-backend migrate import <source-db> --project myproject # filter by project ``` ### Files Created | File | Purpose | |------|---------| | `packages/backend/src/migrate/type-mapper.ts` | Maps legacy types (memory, insight, learning) → current ObservationType | | `packages/backend/src/migrate/backup.ts` | Creates timestamped backups before migration | | `packages/backend/src/migrate/analyzer.ts` | Analyzes legacy schema (tables, types, projects, date range) | | `packages/backend/src/migrate/importer.ts` | Imports sessions and observations with conflict handling | | `packages/backend/src/migrate/index.ts` | Module re-exports | ### Type Mapping Legacy types are automatically mapped to current ObservationType: | Legacy | Current | |--------|---------| | memory, insight, learning | discovery | | decision, architectural_decision | decision | | bug, bugfix, fix | bugfix | | feature | feature | | refactor | refactor | | docs, documentation | docs | | note, bookmark | note | | task, todo | task | | (unknown) | note | ### Features - **Automatic backup**: Creates timestamped backup before import (can disable with `--no-backup`) - **Dry-run mode**: Analyze without making changes - **Conflict resolution**: Skip or overwrite existing records - **Project filtering**: Import only from specific projects - **JSON output**: Machine-readable output with `--json` - **Progress logging**: Reports import statistics
jack closed this issue 2026-01-25 18:57:05 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
customable/claude-mem#198
No description provided.