feat: link dialog finds bullets of all notes; richer sample data with help notes, deep nesting and linked to-dos
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 2m46s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
sandrodachandClaude Opus 5.5 committed 2026-11-01 17:23:53 +01:00
1 parent ae96aa5f2b
commit ca56220e68
12 files changed
+303 -40

No files matched your search

+159
View File
@@ -0,0 +1,159 @@
package storage
import "github.com/sandrodach/mindsift/internal/domain"
// seedLinkedTodos shows the link between notes and tasks both ways: a checklist in a note whose main
// checkbox became a task (the checkboxes below are its subtasks), and a task deepened into a note.
func (s *Store) seedLinkedTodos(user *domain.User, homelab *domain.TaskList) {
listID := ""
if homelab != nil {
listID = homelab.ID
}
blocks := seedBlocks([]seedBlock{
{typ: "callout", text: "Das Häkchen „Backup-Konzept umsetzen“ ist mit einer Aufgabe in der Liste Homelab verknüpft (Badge „Erweitert“). Die Häkchen direkt darunter sind ihre Unteraufgaben: Abhaken hier oder in der Aufgabe – beide Seiten bleiben gleich."},
{typ: "todo", text: "Backup-Konzept umsetzen #backup"},
{level: 1, typ: "todo", text: "restic-Repository auf der Storage Box anlegen", checked: true},
{level: 1, typ: "todo", text: "Nächtlicher Lauf per systemd-Timer"},
{level: 1, typ: "todo", text: "Wiederherstellung einmal komplett testen"},
{level: 1, text: "Normale Punkte gehören nicht zur Aufgabe – hier ist Platz für Gedanken zum Ablauf"},
{level: 2, text: "Aufbewahrung: 7 tägliche, 4 wöchentliche, 6 monatliche Stände"},
{typ: "h3", text: "So geht's"},
{level: 1, text: "Ein Häkchen über „Erweitert“ (Menü am Häkchen) zur Aufgabe machen"},
{level: 1, text: "Neue Häkchen direkt eine Ebene darunter werden automatisch Unteraufgaben"},
{level: 1, text: "Umgekehrt: In den Aufgaben „Als Notiz vertiefen“ – siehe die Notiz zur Aufgabe „Uptime-Monitoring“"},
})
doc, err := s.CreateDocument(user.ID, "", "Backup-Konzept", "💾", "Projekte", blocks, []string{"homelab"}, false)
if err != nil || doc == nil {
return
}
task, err := s.CreateTaskFromDocBlock(user.ID, doc.ID, blocks[1].ID, blocks[1].Content, false)
if err != nil || task == nil {
return
}
s.ReconcileDocTaskLinks(doc.ID)
high, status := "high", "in_progress"
_, _ = s.UpdateThoughtDetails(user.ID, task.ID, nil, nil, nil, &high, &listID, &status, nil, nil, nil)
// A task of the list deepened into a note: the note starts with its checkbox and subtasks
var monitoringID string
_ = s.db.QueryRow(`SELECT id FROM thoughts WHERE user_id = ? AND content LIKE 'Uptime-Monitoring%'`, user.ID).Scan(&monitoringID)
if monitoringID != "" {
_, _ = s.UpdateThoughtTriage(user.ID, monitoringID, "keep", "document", "", "", "")
}
}
// seedHelpNotes: a short guide to MindSift as notes, so the demo explains itself while showing the block
// types (headings, callouts, numbered lists, code, links to notes).
func (s *Store) seedHelpNotes(user *domain.User) {
_, _ = s.CreateFolder(user.ID, "MindSift-Hilfe")
help := func(title, icon string, spec []seedBlock) {
_, _ = s.CreateDocument(user.ID, "", title, icon, "MindSift-Hilfe", seedBlocks(spec), []string{"hilfe"}, false)
}
help("Erste Schritte", "👋", []seedBlock{
{typ: "callout", text: "Willkommen! Diese Notizen erklären MindSift. Alles hier ist Beispielinhalt – ändern, verschieben und löschen ist ausdrücklich erlaubt. #hilfe"},
{typ: "h2", text: "Die Idee in drei Schritten"},
{typ: "numbered", text: "**Erfassen:** Alles, was dir einfällt, sofort in die Leiste oben (Quick Dump) – Taste `C` oder `/`, am Handy das +."},
{typ: "numbered", text: "**Sortieren:** In der Triage gehst du die Gedanken später durch: verwerfen, Aufgabe, Notiz oder Listeneintrag."},
{typ: "numbered", text: "**Vertiefen:** Aufgaben bekommen Unteraufgaben und Termine, Notizen werden zu Gliederungen, Listen teilst du mit der Familie."},
{typ: "h2", text: "Weiterlesen"},
{level: 1, text: "[[Notizen & Outliner]] – Punkte, Ebenen, Zoom und Verlinken"},
{level: 1, text: "[[Zoom ausprobieren]] – eine Gliederung zehn Ebenen tief"},
{level: 1, text: "[[Aufgaben & Kanban]] – Listen, Spalten, Papierkorb"},
{level: 1, text: "[[Listen & Einkauf]] – gemeinsam einkaufen und packen"},
{level: 1, text: "[[Tastenkürzel]] – schneller arbeiten"},
{level: 1, text: "[[Spracheingabe]] – diktieren statt tippen"},
{level: 1, text: "[[Teilen & gemeinsam bearbeiten]]"},
{level: 1, text: "[[API & Smart Home]] – Home Assistant und KI-Agenten anbinden"},
})
help("Notizen & Outliner", "📝", []seedBlock{
{typ: "h2", text: "Punkte und Ebenen"},
{level: 1, text: "`Enter` legt einen neuen Punkt an, `Tab` rückt ein, `Shift+Tab` rückt aus"},
{level: 1, text: "Punkte mit Unterpunkten lassen sich auf- und zuklappen (Pfeil links beim Drüberfahren)"},
{level: 1, text: "Am Punkt (•) ziehen verschiebt den ganzen Ast"},
{level: 1, text: "Klick auf den Punkt (•) **zoomt** in den Ast – probier es in [[Zoom ausprobieren]]"},
{typ: "h2", text: "Formatieren"},
{level: 1, text: "Am Zeilenanfang: `- ` Punkt, `1. ` Nummer, `[] ` Häkchen, `# ` Überschrift"},
{level: 1, text: "`/` öffnet das Menü: /todo, /h1, /code, /callout, /image, /audio, /diktat, /extract …"},
{level: 1, text: "**fett** mit `Strg+B`, *kursiv* mit `Strg+I`, Link mit `Strg+K`"},
{typ: "h2", text: "Verlinken"},
{level: 1, text: "`[[Notiztitel]]` verlinkt eine Notiz, z. B. [[Erste Schritte]]"},
{level: 1, text: "Auch einzelne Punkte lassen sich verlinken: im Verlinken-Fenster nach Text suchen, gefundene Punkte stehen unter den Notizen"},
{level: 1, text: "`#Hashtags` sammeln Fundstellen über alle Notizen, z. B. #hilfe"},
{typ: "h2", text: "Markieren und löschen"},
{level: 1, text: "Mit der Maus über mehrere Punkte ziehen markiert Text über Punktgrenzen; Entf löscht wie in einem Texteditor"},
{level: 1, text: "`Strg+Z` nimmt jede eigene Änderung zurück"},
{typ: "callout", text: "Gelöschte Notizen landen im Papierkorb unten in der Ordnerleiste. Wie lange sie dort bleiben, steht unter Kontoeinstellungen → Aufbewahrung."},
})
help("Zoom ausprobieren", "🔍", []seedBlock{
{typ: "callout", text: "Klick auf einen Punkt (•) zeigt nur diesen Ast. Oben erscheint der Pfad – ein Klick darauf geht Ebene für Ebene zurück."},
{text: "Ebene 1: Projekt „Garten neu anlegen“"},
{level: 1, text: "Ebene 2: Beete"},
{level: 2, text: "Ebene 3: Hochbeet am Zaun"},
{level: 3, text: "Ebene 4: Bepflanzung"},
{level: 4, text: "Ebene 5: Frühjahr"},
{level: 5, text: "Ebene 6: Salat und Radieschen"},
{level: 6, text: "Ebene 7: Sorten"},
{level: 7, text: "Ebene 8: Pflücksalat „Lollo Rosso“"},
{level: 8, text: "Ebene 9: Aussaat ab Mitte März"},
{level: 9, text: "Ebene 10: alle zwei Wochen nachsäen – so gibt es den ganzen Sommer Salat 🥗"},
{level: 7, text: "Ebene 8: Radieschen „Eiszapfen“"},
{level: 5, text: "Ebene 6: Kräuter"},
{level: 6, text: "Ebene 7: Schnittlauch, Petersilie, Basilikum"},
{level: 4, text: "Ebene 5: Sommer"},
{level: 5, text: "Ebene 6: Tomaten und Zucchini"},
{level: 2, text: "Ebene 3: Kräuterspirale"},
{level: 1, text: "Ebene 2: Rasen"},
{level: 2, typ: "todo", text: "Ebene 3: Vertikutieren im April"},
})
help("Aufgaben & Kanban", "✅", []seedBlock{
{typ: "h2", text: "Ansichten"},
{level: 1, text: "**Liste** mit den Reitern Offen, Erledigt und Papierkorb; Gruppe und Sortierung stehen rechts darüber"},
{level: 1, text: "**Kanban** mit eigenen Spalten je Aufgabenliste (Spalten anpassen: Name, Farbe, Erledigt-Spalte)"},
{level: 1, text: "„Alle Aufgaben“ zeigt die Spalten aller Listen zusammengeführt"},
{typ: "h2", text: "Arbeiten mit Aufgaben"},
{level: 1, text: "Klick öffnet die Details: Priorität, Fälligkeit mit Uhrzeit, Wiederholung, Unteraufgaben, Notizen (mit Mikrofon)"},
{level: 1, text: "Ziehen sortiert um oder wechselt die Spalte; `Strg+Z` nimmt Löschen, Verschieben und Abhaken zurück"},
{level: 1, text: "Aufgaben und Notizen lassen sich verknüpfen – Beispiel: [[Backup-Konzept]]"},
{typ: "h2", text: "Aufräumen"},
{level: 1, text: "Erledigte wandern nach einer Frist in den Papierkorb, der sich später selbst leert"},
{level: 1, text: "Die Fristen stellst du unter Kontoeinstellungen → Aufbewahrung ein"},
})
help("Listen & Einkauf", "🛒", []seedBlock{
{text: "Kategorien entstehen aus Hashtags: `Hafermilch #Kühlregal` landet unter „Kühlregal“"},
{text: "Mengen ins eigene Feld, z. B. `500 g` oder `3x`"},
{text: "Geteilte Listen zeigen Abhaken bei allen sofort – ideal für den Wocheneinkauf"},
{text: "Abgehakte Einträge verschwinden nach einer Woche von selbst (einstellbar unter Aufbewahrung)"},
})
help("Tastenkürzel", "⌨️", []seedBlock{
{typ: "h2", text: "Überall"},
{level: 1, text: "`C` oder `/` – Quick Dump"},
{level: 1, text: "`Strg+K` – globale Suche über Notizen, Aufgaben und Listen"},
{typ: "h2", text: "Triage"},
{level: 1, text: "`H` / `←` verwerfen, `L` / `→` Aufgabe, `T` mit Termin, `D` Notiz, Leertaste später"},
{typ: "h2", text: "Notizen"},
{level: 1, text: "`Tab` / `Shift+Tab` ein- und ausrücken, `Strg+Z` / `Strg+Shift+Z` rückgängig und wiederholen"},
{level: 1, text: "`Strg+Shift+F` Fokus-Modus – nur die Notiz, in Lesebreite"},
{typ: "h2", text: "Aufgaben"},
{level: 1, text: "`Strg+Z` nimmt Löschen, Verschieben und Abhaken zurück"},
})
help("Spracheingabe", "🎙️", []seedBlock{
{text: "Mikrofone gibt es im Quick Dump, beim Anlegen von Aufgaben und Listeneinträgen, in den Detailnotizen einer Aufgabe und als `/diktat` in Notizen"},
{text: "Am Handy: das + gedrückt halten startet sofort eine Aufnahme"},
{text: "Mit eigenem Whisper-Server bleibt die Aufnahme auf deinem Server; unter Kontoeinstellungen → Spracheingabe wählst du Whisper oder die Erkennung des Browsers"},
{typ: "callout", text: "In dieser Demo nutzt MindSift die Spracherkennung des Browsers."},
})
help("Teilen & gemeinsam bearbeiten", "🤝", []seedBlock{
{text: "Notizen, Ordner, Aufgabenlisten und Listen lassen sich mit Personen oder Gruppen teilen – zum Bearbeiten oder nur zum Lesen"},
{text: "In einer geteilten Notiz schreiben mehrere gleichzeitig; wer in einem Punkt tippt, hält ihn kurz für sich"},
{level: 1, text: "Probier es aus: „Homelab 2.0“ ist mit dem Demo-Konto **user** geteilt – in einem zweiten Browser als user/user anmelden"},
{text: "Aufgaben in geteilten Listen lassen sich Personen zuweisen und beobachten"},
})
help("API & Smart Home", "🔌", []seedBlock{
{text: "Unter Kontoeinstellungen → API legst du Schlüssel mit genau den Rechten an, die ein Gerät braucht"},
{typ: "h3", text: "Heute fällige Aufgaben abfragen"},
{typ: "code", lang: "bash", text: "curl -H \"X-API-Key: mindsift_sec_…\" \\\n \"https://mindsift.example.com/api/v1/tasks?due=today&status=open\""},
{typ: "h3", text: "KI-Agenten (MCP)"},
{text: "Claude Code, Codex und andere Agenten lesen und pflegen Aufgaben und Listen über `/api/v1/mcp`"},
{text: "Was ein Schlüssel anlegt oder ändert, trägt eine kleine Badge mit seinem Namen"},
})
}