diff --git a/AGENTS.md b/AGENTS.md index d50c5ad..88c8a97 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -65,30 +65,35 @@ Before doing anything else: 1. Read `SOUL.md` — this is who you are 2. Read `USER.md` — this is who you're helping 3. Read `memory/YYYY-MM-DD.md` (today + yesterday) for recent context -4. **If in MAIN SESSION** (direct chat with your human): Also read `MEMORY.md` Don't ask permission. Just do it. ## Memory You wake up fresh each session. These files are your continuity: -- **Daily notes:** `memory/YYYY-MM-DD.md` (create `memory/` if needed) — rezumate SCURTE, concluzii -- **Long-term:** `MEMORY.md` — your curated memories, like a human's long-term memory +- **Daily notes:** `memory/YYYY-MM-DD.md` — rezumate SCURTE, concluzii (încărcat: azi + ieri) - **Conversations:** `conversations/YYYY-MM-DD-subiect.md` — conversații complete (NU se încarcă automat) -- **Projects:** `projects/nume-proiect.md` — detalii proiecte cu clienți (NU se încarcă automat) +- **Projects:** `kb/projects/nume-proiect/` — directoare proiecte cu toate fișierele aferente +- **Long-term:** `USER.md` pentru info despre Marius, `AGENTS.md` pentru reguli/patterns -**Regulă:** În `memory/` pun doar concluzii și link-uri. Detaliile merg în `conversations/` sau `projects/`. +**Regulă:** În `memory/` pun doar concluzii și link-uri. Detaliile merg în `conversations/` sau `kb/`. Capture what matters. Decisions, context, things to remember. Skip the secrets unless asked to keep them. -### 🧠 MEMORY.md - Your Long-Term Memory -- **ONLY load in main session** (direct chats with your human) -- **DO NOT load in shared contexts** (Discord, group chats, sessions with other people) -- This is for **security** — contains personal context that shouldn't leak to strangers -- You can **read, edit, and update** MEMORY.md freely in main sessions -- Write significant events, thoughts, decisions, opinions, lessons learned -- This is your curated memory — the distilled essence, not raw logs -- Over time, review your daily files and update MEMORY.md with what's worth keeping +### 🧠 Practici Memorie (OBLIGATORIU) + +1. **memory_search PRIMUL** - Înainte să răspund la întrebări despre trecut, caut în memory/ +2. **Actualizez USER.md** - Când aflu informații noi despre Marius (preferințe, context, proiecte) +3. **Actualizez AGENTS.md** - Când descopăr patterns sau reguli noi care funcționează +4. **Note zilnice scurte** - Maxim 15 linii, secțiuni clare: + ```markdown + ## Decizii + ## De făcut + ## Învățat + ``` +5. **Curățare periodică** - La heartbeat verific memory/ > 14 zile: + - Ce e important → mut în USER.md sau AGENTS.md + - Restul → arhivez sau șterg ### 📝 Write It Down - No "Mental Notes"! - **Memory is limited** — if you want to remember something, WRITE IT TO A FILE @@ -208,10 +213,10 @@ You are free to edit `HEARTBEAT.md` with a short checklist or reminders. Keep it ### 🎬 YouTube Notes (OBLIGATORIU) Când primesc un link YouTube: 1. **ÎNTOTDEAUNA** extrag transcrierea completă -2. **ÎNTOTDEAUNA** salvez nota în `notes/youtube/YYYY-MM-DD_titlu-slug.md` +2. **ÎNTOTDEAUNA** salvez nota în `kb/youtube/YYYY-MM-DD_titlu-slug.md` 3. Nota trebuie să conțină: TL;DR, pași concreți, comenzi, puncte cheie 4. Nu dau rezumate generice - surprind **esența** și **detaliile acționabile** -5. **DUPĂ SALVARE** rulez: `python3 ~/clawd/tools/update_notes_index.py` (actualizează index.json pentru notes.html) +5. **DUPĂ SALVARE** rulez: `python3 ~/clawd/tools/update_notes_index.py` (actualizează index.json pentru kb.html) ### 📦 Git Commits (~/clawd → gitea.romfast.ro/romfast/clawd) - **NU face commit automat** - întreabă-l pe Marius când să dau commit @@ -271,15 +276,6 @@ Astfel Marius poate vedea în https://moltbot.tailf7372d.ts.net/echo/ ce job-uri - Commit and push your own changes - **Review and update MEMORY.md** (see below) -### 🔄 Memory Maintenance (During Heartbeats) -Periodically (every few days), use a heartbeat to: -1. Read through recent `memory/YYYY-MM-DD.md` files -2. Identify significant events, lessons, or insights worth keeping long-term -3. Update `MEMORY.md` with distilled learnings -4. Remove outdated info from MEMORY.md that's no longer relevant - -Think of it like a human reviewing their journal and updating their mental model. Daily files are raw notes; MEMORY.md is curated wisdom. - The goal: Be helpful without being annoying. Check in a few times a day, do useful background work, but respect quiet time. ## Make It Yours diff --git a/grup-sprijin/index.json b/grup-sprijin/index.json new file mode 100644 index 0000000..7004179 --- /dev/null +++ b/grup-sprijin/index.json @@ -0,0 +1,118 @@ +[ + { + "id": "ancorare-emotii", + "title": "Exercițiu de ancorare a emoțiilor", + "type": "exercitiu", + "tags": [ + "NLP", + "ancorare", + "emotii", + "corp" + ], + "used": null, + "content": "Să simți o emoție pozitivă pe care ți-o dorești și apoi să faci exercițiul cu ancorarea emoției. Când vrei să simți liniște, satisfacție, bucurie, energie - să revină în corp.\n\nPași:\n1. Gândește-te la un moment în care ai simțit emoția dorită\n2. Simte-o în corp\n3. Ancoreaz-o (gest, cuvânt, imagine)\n4. Testează ancora" + }, + { + "id": "meditatie-demnitate", + "title": "Meditația cu demnitatea", + "type": "meditatie", + "tags": [ + "meditatie", + "demnitate", + "sine" + ], + "used": null, + "content": "Meditație despre demnitate personală.\n\n(De dezvoltat - Marius să adauge textul complet)" + }, + { + "id": "meditatie-eu-sunt-mai-mare", + "title": "Eu sunt mai mare decât gândurile și emoțiile mele", + "type": "meditatie", + "tags": [ + "meditatie", + "ganduri", + "emotii", + "distantare" + ], + "used": null, + "content": "Meditație: Eu sunt mai mare decât gândurile mele, mai mare decât emoțiile mele.\n\nIdee: Creezi distanță între tine și gânduri/emoții. Tu ești observatorul, nu gândul." + }, + { + "id": "meditatie-mindfulness", + "title": "Moment de mindfulness", + "type": "meditatie", + "tags": [ + "meditatie", + "mindfulness", + "prezent" + ], + "used": null, + "content": "Un moment de mindfulness - prezență în aici și acum.\n\n(De dezvoltat)" + }, + { + "id": "intrebare-bucurie-azi", + "title": "Ce ai făcut azi care ți-a adus bucurie?", + "type": "intrebare", + "tags": [ + "introspectie", + "bucurie", + "energie", + "recunostinta" + ], + "used": null, + "content": "Întrebări în secvență:\n1. Ce îți dorești să simți? (bucurie, energie, entuziasm, motivație)\n2. Când ai mai simțit asta?\n3. Ce ai făcut ASTĂZI care să îți aducă acea emoție?" + }, + { + "id": "intrebare-copil-interior", + "title": "Ce îți aducea bucurie când erai mic?", + "type": "intrebare", + "tags": [ + "introspectie", + "copilarie", + "pasiune", + "bucurie" + ], + "used": null, + "content": "Ce îți doreai să faci când erai mic? Ce îți aducea bucurie, entuziasm, satisfacție?\n\nCare era emoția? Ce poți să faci ACUM care să îți dea aceeași emoție?\n\nAdu-ți aminte de copilul care erai (poate mai ești și acum). Ce dorește să facă? Ce simțea? Când ai simțit acele emoții?" + }, + { + "id": "reflectie-barbati-energie", + "title": "Credințe despre bărbați și cerut ajutor", + "type": "reflectie", + "tags": [ + "credinte", + "masculin", + "ajutor", + "energie", + "vulnerabilitate" + ], + "used": null, + "content": "Credințe limitatoare:\n- Bărbații sunt puternici\n- Bărbații trebuie să facă totul singuri\n- Bărbații nu trebuie să ceară ajutor\n\nȘi pentru femei - când trebuie să facă totul singure, nu cer ajutor, se încarcă, trag, împing dintr-o energie masculină.\n\nE OK să faci, dar te oprește de la resursele de energie și creativitate.\n\nÎntrebare: Unde tragi singur când ai putea cere ajutor?" + }, + { + "id": "reflectie-oglinda", + "title": "Tot ce văd la tine am și eu în mine", + "type": "reflectie", + "tags": [ + "oglinda", + "proiectie", + "emotii", + "autocunoastere" + ], + "used": null, + "content": "Tot ce văd la tine am și eu în mine:\n- Sentimentul de vină, de rușine\n- Nu în aceleași situații\n- Furie, frustrare, jenă\n- Dar și bucurie\n\nCeilalți sunt oglinzi pentru noi." + }, + { + "id": "beneficiu-grup-siguranta", + "title": "Beneficiul grupului - siguranță", + "type": "reflectie", + "tags": [ + "grup", + "siguranta", + "energie", + "vulnerabilitate" + ], + "used": null, + "content": "Câtă energie consum să arăt ce trebuie?\n\nÎn grup nu mai este nevoie de energie să mențin scutul sus, să țin sub apă balonul.\n\nÎntr-un grup de sprijin, mă simt în siguranță, nu sunt judecat." + } +] \ No newline at end of file diff --git a/kanban/api.py b/kanban/api.py index 4956e70..1f2494e 100644 --- a/kanban/api.py +++ b/kanban/api.py @@ -63,6 +63,8 @@ class TaskBoardHandler(SimpleHTTPRequestHandler): def do_GET(self): if self.path == '/api/status': self.send_json({'status': 'ok', 'time': datetime.now().isoformat()}) + elif self.path == '/api/git': + self.handle_git_status() elif self.path.startswith('/api/files'): self.handle_files_get() elif self.path.startswith('/api/'): @@ -71,6 +73,62 @@ class TaskBoardHandler(SimpleHTTPRequestHandler): # Serve static files super().do_GET() + def handle_git_status(self): + """Get git status for dashboard.""" + try: + workspace = Path('/home/moltbot/clawd') + + # Get current branch + branch = subprocess.run( + ['git', 'branch', '--show-current'], + cwd=workspace, capture_output=True, text=True, timeout=5 + ).stdout.strip() + + # Get last commit + last_commit = subprocess.run( + ['git', 'log', '-1', '--format=%h|%s|%cr'], + cwd=workspace, capture_output=True, text=True, timeout=5 + ).stdout.strip() + + commit_parts = last_commit.split('|') if last_commit else ['', '', ''] + + # Get uncommitted files + status_output = subprocess.run( + ['git', 'status', '--short'], + cwd=workspace, capture_output=True, text=True, timeout=5 + ).stdout.strip() + + uncommitted = status_output.split('\n') if status_output else [] + uncommitted = [f for f in uncommitted if f.strip()] + + # Get diff stats if there are uncommitted files + diff_stat = '' + if uncommitted: + diff_stat = subprocess.run( + ['git', 'diff', '--stat', '--cached'], + cwd=workspace, capture_output=True, text=True, timeout=5 + ).stdout.strip() + if not diff_stat: + diff_stat = subprocess.run( + ['git', 'diff', '--stat'], + cwd=workspace, capture_output=True, text=True, timeout=5 + ).stdout.strip() + + self.send_json({ + 'branch': branch, + 'lastCommit': { + 'hash': commit_parts[0] if len(commit_parts) > 0 else '', + 'message': commit_parts[1] if len(commit_parts) > 1 else '', + 'time': commit_parts[2] if len(commit_parts) > 2 else '' + }, + 'uncommitted': uncommitted, + 'uncommittedCount': len(uncommitted), + 'diffStat': diff_stat, + 'clean': len(uncommitted) == 0 + }) + except Exception as e: + self.send_json({'error': str(e)}, 500) + def handle_files_get(self): """List files or get file content.""" from urllib.parse import urlparse, parse_qs diff --git a/kanban/archive/tasks-2025-01.json b/kanban/archive/tasks-2026-01.json similarity index 100% rename from kanban/archive/tasks-2025-01.json rename to kanban/archive/tasks-2026-01.json diff --git a/kanban/index.html b/kanban/index.html index ddd3172..0968bac 100644 --- a/kanban/index.html +++ b/kanban/index.html @@ -69,6 +69,12 @@ color: #22c55e; } + .status-actions { + display: flex; + gap: var(--space-2); + margin-left: auto; + } + .status-summary { flex: 1; font-size: var(--text-xs); @@ -92,64 +98,186 @@ } .status-content { - padding: var(--space-3) var(--space-4); + padding: 0; } - .status-row { - display: flex; - flex-wrap: wrap; - gap: var(--space-4); - margin-bottom: var(--space-2); + /* Status sections */ + .status-section { + border-bottom: 1px solid var(--border); } - .status-item { + .status-section:last-child { + border-bottom: none; + } + + .status-section-header { display: flex; align-items: center; - gap: var(--space-1); + gap: var(--space-3); + padding: var(--space-3) var(--space-4); + cursor: pointer; + user-select: none; + transition: background var(--transition-fast); + } + + .status-section-header:hover { + background: var(--bg-elevated); + } + + .status-section-icon { + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-md); + flex-shrink: 0; + } + + .status-section-icon svg { + width: 18px; + height: 18px; + } + + .status-section-icon.git { + background: rgba(249, 115, 22, 0.15); + color: #f97316; + } + + .status-section-icon.anaf { + background: rgba(34, 197, 94, 0.15); + color: #22c55e; + } + + .status-section-icon.cron { + background: rgba(99, 102, 241, 0.15); + color: #818cf8; + } + + .status-section-info { + flex: 1; + min-width: 0; + } + + .status-section-title { font-size: var(--text-sm); - } - - .status-label { - color: var(--text-muted); - } - - .status-value { font-weight: 600; color: var(--text-primary); - } - - .status-value.ok { color: #22c55e; } - .status-value.warning { color: #f59e0b; } - .status-value.error { color: #ef4444; } - - .status-time { - font-size: var(--text-xs); - color: var(--text-muted); - margin-left: var(--space-1); - } - - .cron-row { display: flex; align-items: center; gap: var(--space-2); - font-size: var(--text-sm); - padding-top: var(--space-2); - border-top: 1px solid var(--border); } - .cron-label { + .status-section-subtitle { + font-size: var(--text-xs); + color: var(--text-muted); + margin-top: 2px; + } + + .status-badge { + padding: 2px 8px; + border-radius: var(--radius-sm); + font-size: var(--text-xs); + font-weight: 600; + } + + .status-badge.ok { + background: rgba(34, 197, 94, 0.15); + color: #22c55e; + } + + .status-badge.warning { + background: rgba(249, 115, 22, 0.15); + color: #f97316; + } + + .status-badge.error { + background: rgba(239, 68, 68, 0.15); + color: #ef4444; + } + + .status-section-toggle { + width: 16px; + height: 16px; + color: var(--text-muted); + transition: transform var(--transition-fast); + } + + .status-section.collapsed .status-section-toggle { + transform: rotate(-90deg); + } + + .status-section.collapsed .status-section-details { + display: none; + } + + .status-section-details { + padding: 0 var(--space-4) var(--space-3); + padding-left: calc(var(--space-4) + 32px + var(--space-3)); + } + + .status-detail-item { + display: flex; + align-items: center; + gap: var(--space-2); + font-size: var(--text-xs); + color: var(--text-secondary); + padding: var(--space-1) 0; + } + + .status-detail-item svg { + width: 12px; + height: 12px; color: var(--text-muted); } - .cron-list { + .status-detail-item.uncommitted { + color: #f97316; + } + + .status-detail-item code { + font-family: monospace; + background: var(--bg-elevated); + padding: 1px 4px; + border-radius: 2px; + font-size: 11px; + } + + /* Cron items */ + .cron-item { + display: flex; + align-items: center; + gap: var(--space-2); + font-size: var(--text-xs); + padding: var(--space-1) 0; + } + + .cron-item.done { + color: var(--text-muted); + } + + .cron-item.done .cron-name { + text-decoration: line-through; + } + + .cron-item.pending { color: var(--text-secondary); } - .cron-done { - color: var(--text-muted); - text-decoration: line-through; + .cron-time { + font-family: monospace; + min-width: 45px; } + .cron-icon { + width: 14px; + height: 14px; + } + + .cron-icon.done { color: #22c55e; } + .cron-icon.pending { color: var(--text-muted); } + .cron-icon.failed { color: #ef4444; } + /* Two-column dashboard */ .dashboard-grid { display: grid; @@ -696,27 +824,75 @@ Status
${git.lastCommit.hash} ${git.lastCommit.message} (${git.lastCommit.time})
+ ${file}
+