diff --git a/antfarm b/antfarm
new file mode 160000
index 0000000..2fff211
--- /dev/null
+++ b/antfarm
@@ -0,0 +1 @@
+Subproject commit 2fff2115022afc796908f1a63124987437520b69
diff --git a/dashboard/habits.json b/dashboard/habits.json
index b1b63ca..0824107 100644
--- a/dashboard/habits.json
+++ b/dashboard/habits.json
@@ -1,4 +1,14 @@
{
- "habits": [],
- "lastUpdated": "2026-02-10T12:39:00Z"
-}
+ "habits": [
+ {
+ "id": "habit-test1",
+ "name": "Test Habit",
+ "frequency": "daily",
+ "createdAt": "2026-02-01T10:00:00Z",
+ "completions": [
+ "2026-02-10"
+ ]
+ }
+ ],
+ "lastUpdated": "2026-02-10T10:00:00Z"
+}
\ No newline at end of file
diff --git a/dashboard/index.html b/dashboard/index.html
index e15431c..d2ab4ab 100644
--- a/dashboard/index.html
+++ b/dashboard/index.html
@@ -1600,10 +1600,34 @@
const msg = status.anaf.ok !== false ? 'Nicio modificare' : (status.anaf.message || 'Modificări!');
subtitle.textContent = `${msg} · ${lastCheck}`;
- if (status.anaf.lastCheck) {
- document.getElementById('anafLastCheck').textContent =
- 'Ultima verificare: ' + status.anaf.lastCheck;
+ // Actualizează detaliile
+ const details = document.getElementById('anafDetails');
+ let html = '';
+
+ // Adaugă detaliile modificărilor dacă există
+ if (status.anaf.changes && status.anaf.changes.length > 0) {
+ status.anaf.changes.forEach(change => {
+ const summaryText = change.summary && change.summary.length > 0
+ ? ' - ' + change.summary.join(', ')
+ : '';
+ html += `
+
+ `;
+ });
+ } else {
+ html = `
+
+
+ Toate paginile sunt la zi
+
+ `;
}
+
+ details.innerHTML = html;
+ lucide.createIcons();
}
return status;
diff --git a/dashboard/status.json b/dashboard/status.json
index 69d43ce..8af62fa 100644
--- a/dashboard/status.json
+++ b/dashboard/status.json
@@ -13,7 +13,16 @@
"ok": false,
"status": "MODIFICĂRI",
"message": "1 modificări detectate",
- "lastCheck": "09 Feb 2026, 14:00",
- "changesCount": 1
+ "lastCheck": "10 Feb 2026, 12:39",
+ "changesCount": 1,
+ "changes": [
+ {
+ "name": "Declarația 100 - Obligații de plată la bugetul de stat",
+ "url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/100.html",
+ "summary": [
+ "Soft A: 09.02.2026 → 10.02.2026"
+ ]
+ }
+ ]
}
}
\ No newline at end of file
diff --git a/memory/2026-02-10.md b/memory/2026-02-10.md
new file mode 100644
index 0000000..2e78121
--- /dev/null
+++ b/memory/2026-02-10.md
@@ -0,0 +1,21 @@
+# 2026-02-10
+
+## Dashboard ANAF - Detalii Modificări
+
+**Context:** Marius a cerut să vadă ce modificări detectează ANAF Monitor în dashboard, nu doar mesaj generic "Modificări detectate".
+
+**Implementare:**
+1. **monitor_v2.py** - modificat `update_dashboard_status()` să salveze detalii în `status.json`:
+ - Nume pagină modificată
+ - URL către pagina ANAF
+ - Rezumat modificări (ex: "Soft A: 09.02.2026 → 10.02.2026")
+
+2. **dashboard/index.html** - modificat `loadAnafStatus()` să afișeze detaliile:
+ - Link-uri clickabile către paginile ANAF
+ - Lista modificărilor pentru fiecare pagină
+ - Expandabil în secțiunea ANAF Monitor
+
+**Modificare reală detectată astăzi:**
+- D100 (Declarația 100) - Soft A: 09.02.2026 → 10.02.2026
+
+**Status:** Implementat, netestat în browser. Așteaptă commit.
diff --git a/memory/kb/index.json b/memory/kb/index.json
index dcb91f8..a0437d2 100644
--- a/memory/kb/index.json
+++ b/memory/kb/index.json
@@ -1,5 +1,48 @@
{
"notes": [
+ {
+ "file": "notes-data/tools/antfarm-workflow.md",
+ "title": "Antfarm Workflow - Echo",
+ "date": "2026-02-10",
+ "tags": [],
+ "domains": [],
+ "types": [],
+ "category": "tools",
+ "project": null,
+ "subdir": null,
+ "video": "",
+ "tldr": "**Update:** După ce învăț fluxul mai bine"
+ },
+ {
+ "file": "memory/provocare-azi.md",
+ "title": "Provocarea Zilei - 2026-02-08",
+ "date": "2026-02-10",
+ "tags": [],
+ "domains": [],
+ "types": [
+ "memory"
+ ],
+ "category": "memory",
+ "project": null,
+ "subdir": null,
+ "video": "",
+ "tldr": "- Monica Ion - Legea Fractalilor (Cele 7 Legi Universale)"
+ },
+ {
+ "file": "memory/2026-02-10.md",
+ "title": "2026-02-10",
+ "date": "2026-02-10",
+ "tags": [],
+ "domains": [],
+ "types": [
+ "memory"
+ ],
+ "category": "memory",
+ "project": null,
+ "subdir": null,
+ "video": "",
+ "tldr": "**Status:** Aștept confirmare de la Marius să lansez `antfarm workflow run feature-dev`."
+ },
{
"file": "notes-data/coaching/2026-02-09-seara.md",
"title": "Gândul de Seară - Duminică, 9 Februarie 2026",
@@ -813,21 +856,6 @@
"video": "https://moltbot.tailf7372d.ts.net/echo/files.html#memory/kb/articole/monica-ion/cele-7-legi-universale.md",
"tldr": "Cele 7 Legi Universale sunt principii fundamentale care explică cum funcționează mintea, de ce trăim viața așa cum o trăim și cum putem genera transformare reală. Fiecare lege este susținută de istori..."
},
- {
- "file": "memory/provocare-azi.md",
- "title": "Provocarea Zilei - 2026-02-08",
- "date": "2026-02-08",
- "tags": [],
- "domains": [],
- "types": [
- "memory"
- ],
- "category": "memory",
- "project": null,
- "subdir": null,
- "video": "",
- "tldr": "- Monica Ion - Legea Fractalilor (Cele 7 Legi Universale)"
- },
{
"file": "memory/jurnal-motivatie.md",
"title": "Jurnal - Drumul spre regăsirea motivației",
@@ -3346,7 +3374,7 @@
}
],
"stats": {
- "total": 194,
+ "total": 196,
"by_domain": {
"work": 59,
"health": 34,
@@ -3365,9 +3393,9 @@
"projects": 85,
"reflectii": 3,
"retete": 1,
- "tools": 5,
+ "tools": 6,
"youtube": 42,
- "memory": 16
+ "memory": 17
}
},
"domains": [
diff --git a/memory/kb/tools/antfarm-workflow.md b/memory/kb/tools/antfarm-workflow.md
new file mode 100644
index 0000000..90362c0
--- /dev/null
+++ b/memory/kb/tools/antfarm-workflow.md
@@ -0,0 +1,87 @@
+# Antfarm Workflow - Echo
+
+**Instalat:** github.com/snarktank/antfarm
+**CLI:** `antfarm` (în PATH, global)
+**Dashboard:** https://moltbot.tailf7372d.ts.net:3333
+**Docs:** ~/clawd/antfarm/README.md, ~/clawd/antfarm/docs/creating-workflows.md
+
+---
+
+## Flux rapid (pentru Echo)
+
+### 1. Primesc request de la Marius
+**EX:** "Vreau să construiesc un Habit tracker în dashboard"
+
+### 2. Lansez direct workflow-ul cu promptul lui Marius
+```bash
+cd ~/clawd
+antfarm workflow run feature-dev ""
+```
+
+**NU:**
+- ✗ Verific dacă e instalat (e instalat, permanent)
+- ✗ Fac eu requirements/acceptance criteria (planner-ul face asta)
+- ✗ Complicez task string-ul (simplitate = mai bine)
+
+**DA:**
+- ✓ Trimit prompt-ul EXACT cum îl primesc de la Marius
+- ✓ Planner-ul descompune în stories automat
+- ✓ Developer-ul decide tehnologii/structură
+
+### 3. Monitorez progres
+```bash
+antfarm workflow status
+antfarm workflow runs # listă toate
+```
+
+### 4. Raportez când e gata
+Agenții lucrează autonom (polling 15 min). Raportez când:
+- Stories finalizate
+- Erori care necesită intervenție
+- PR creat pentru review
+
+---
+
+## Workflows disponibile
+
+| Workflow | Când să-l folosesc |
+|----------|-------------------|
+| `feature-dev` | Features noi, refactoring, îmbunătățiri |
+| `bug-fix` | Bug-uri cu pași de reproducere |
+| `security-audit` | Audit securitate codebase |
+
+---
+
+## Comenzi utile
+
+```bash
+# Status rapid
+antfarm workflow status
+
+# Force trigger agent (skip 15min wait)
+cron action=run jobId=antfarm/feature-dev/developer
+
+# Logs
+antfarm logs 50
+
+# Resume dacă failuit
+antfarm workflow resume
+
+# Dashboard
+antfarm dashboard status
+```
+
+---
+
+## Reguli importante
+
+1. **Task string = prompt exact de la Marius** (nu complica)
+2. **Planner face requirements** (nu tu)
+3. **Agenții sunt autonomi** (polling 15 min, nu trebuie să-i controlezi)
+4. **Monitor dashboard** (https://moltbot.tailf7372d.ts.net:3333)
+5. **Raportează doar când e relevant** (finalizare, erori, PR)
+
+---
+
+**Creat:** 2026-02-10
+**Update:** După ce învăț fluxul mai bine
diff --git a/progress.txt b/progress.txt
index a074f36..b47b238 100644
--- a/progress.txt
+++ b/progress.txt
@@ -452,9 +452,48 @@ CODEBASE PATTERNS UPDATE:
- dashboard/test_habits_form_submit.py (created)
- dashboard/habits.json (reset to empty for testing)
+[✓] Story 12.0: Frontend - Habit card styling
+ Commit: c1d4ed1
+ Date: 2026-02-10
+
+ Implementation:
+ - Enhanced habit card styling to match dashboard aesthetic
+ - Changed card border-radius from --radius-md to --radius-lg for smoother appearance
+ - Changed streak font-size from --text-lg to --text-xl for prominent display
+ - Added green background tint (rgba(34, 197, 94, 0.1)) for checked habit cards
+ - Added 'checked' CSS class to habit-card when checkedToday is true
+ - Implemented pulse animation on checkbox hover for unchecked habits
+ - Animation scales checkbox subtly (1.0 to 1.05) with 1.5s ease-in-out timing
+ - Styled frequency badge as dashboard tag with inline-block, bg-elevated, border, padding
+ - Updated JavaScript createHabitCard to add 'checked' class to card element
+ - Updated JavaScript checkHabit to add 'checked' class on successful check
+ - Updated error rollback to remove 'checked' class if check fails
+ - Added mobile responsiveness with @media (max-width: 768px) query
+ - Mobile styles: full width cards, reduced padding, smaller icons (36px, 28px)
+ - All CSS uses CSS variables for theming consistency
+
+ Tests:
+ - Created dashboard/test_habits_card_styling.py with 10 comprehensive tests
+ - Tests for file existence
+ - Tests for card using --bg-surface with --border (acceptance criteria 1)
+ - Tests for --radius-lg border radius on cards (acceptance criteria 6)
+ - Tests for streak using --text-xl font size (acceptance criteria 2)
+ - Tests for checked habit green background tint (acceptance criteria 3)
+ - Tests for pulse animation on unchecked checkbox hover (acceptance criteria 4)
+ - Tests for frequency badge dashboard tag styling (acceptance criteria 5)
+ - Tests for mobile responsiveness with full width cards (acceptance criteria 7)
+ - Tests for checked class in createHabitCard function
+ - Summary test verifying all 7 acceptance criteria
+ - All 10 tests pass ✓ (acceptance criteria 8)
+ - All previous tests (schema, API, HTML, modal, display, check, form) still pass ✓
+
+ Files modified:
+ - dashboard/habits.html (updated CSS and JavaScript for styling enhancements)
+ - dashboard/test_habits_card_styling.py (created)
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
NEXT STEPS:
-- Continue with remaining 7 stories
+- Continue with remaining 6 stories
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
diff --git a/tools/anaf-monitor/monitor_v2.py b/tools/anaf-monitor/monitor_v2.py
index 8ee230e..4fae3fd 100644
--- a/tools/anaf-monitor/monitor_v2.py
+++ b/tools/anaf-monitor/monitor_v2.py
@@ -313,17 +313,33 @@ def check_page(page, saved_versions, saved_hashes):
log(f"OK: {page_id}")
return None
-def update_dashboard_status(has_changes, changes_count):
+def update_dashboard_status(has_changes, changes_count, changes_list=None):
"""Actualizează status.json pentru dashboard"""
try:
status = load_json(DASHBOARD_STATUS, {})
- status['anaf'] = {
+ anaf_status = {
'ok': not has_changes,
'status': 'MODIFICĂRI' if has_changes else 'OK',
'message': f'{changes_count} modificări detectate' if has_changes else 'Nicio modificare detectată',
'lastCheck': datetime.now().strftime('%d %b %Y, %H:%M'),
'changesCount': changes_count
}
+
+ # Adaugă detaliile modificărilor pentru dashboard
+ if has_changes and changes_list:
+ anaf_status['changes'] = []
+ for change in changes_list:
+ change_detail = {
+ 'name': change.get('name', ''),
+ 'url': change.get('url', ''),
+ 'summary': []
+ }
+ # Ia primele 3 modificări ca rezumat
+ if change.get('changes'):
+ change_detail['summary'] = change['changes'][:3]
+ anaf_status['changes'].append(change_detail)
+
+ status['anaf'] = anaf_status
save_json(DASHBOARD_STATUS, status)
except Exception as e:
log(f"ERROR updating dashboard status: {e}")
@@ -345,7 +361,7 @@ def main():
save_json(HASHES_FILE, saved_hashes)
# Update dashboard status
- update_dashboard_status(len(all_changes) > 0, len(all_changes))
+ update_dashboard_status(len(all_changes) > 0, len(all_changes), all_changes)
log("=== Monitor complete ===")