mcp-cronos 1.0.0__tar.gz

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 (49) hide show
  1. mcp_cronos-1.0.0/.github/workflows/publish.yml +20 -0
  2. mcp_cronos-1.0.0/.gitignore +73 -0
  3. mcp_cronos-1.0.0/CLAUDE.md +228 -0
  4. mcp_cronos-1.0.0/ESEMPIO_FORMATO_DIARIO.md +192 -0
  5. mcp_cronos-1.0.0/PKG-INFO +713 -0
  6. mcp_cronos-1.0.0/README.md +683 -0
  7. mcp_cronos-1.0.0/docs/plans/2026-04-01-cronos-refactor.md +1146 -0
  8. mcp_cronos-1.0.0/docs/plans/2026-04-09-public-release.md +1918 -0
  9. mcp_cronos-1.0.0/docs/specs/2026-04-09-public-release-design.md +251 -0
  10. mcp_cronos-1.0.0/pyproject.toml +62 -0
  11. mcp_cronos-1.0.0/src/mcp_cronos/__init__.py +16 -0
  12. mcp_cronos-1.0.0/src/mcp_cronos/config.py +232 -0
  13. mcp_cronos-1.0.0/src/mcp_cronos/default_templates/consolida.md +50 -0
  14. mcp_cronos-1.0.0/src/mcp_cronos/default_templates/fine_giornata.md +146 -0
  15. mcp_cronos-1.0.0/src/mcp_cronos/default_templates/standup.md +45 -0
  16. mcp_cronos-1.0.0/src/mcp_cronos/i18n.py +153 -0
  17. mcp_cronos-1.0.0/src/mcp_cronos/server.py +550 -0
  18. mcp_cronos-1.0.0/src/mcp_cronos/template_loader.py +54 -0
  19. mcp_cronos-1.0.0/src/mcp_cronos/templates.py +190 -0
  20. mcp_cronos-1.0.0/src/mcp_cronos/tools/__init__.py +25 -0
  21. mcp_cronos-1.0.0/src/mcp_cronos/tools/aggiungi_progetto.py +212 -0
  22. mcp_cronos-1.0.0/src/mcp_cronos/tools/cerca.py +102 -0
  23. mcp_cronos-1.0.0/src/mcp_cronos/tools/consolida.py +162 -0
  24. mcp_cronos-1.0.0/src/mcp_cronos/tools/entries.py +221 -0
  25. mcp_cronos-1.0.0/src/mcp_cronos/tools/fine_giornata.py +181 -0
  26. mcp_cronos-1.0.0/src/mcp_cronos/tools/reader.py +192 -0
  27. mcp_cronos-1.0.0/src/mcp_cronos/tools/scrivi_fine_giornata.py +128 -0
  28. mcp_cronos-1.0.0/src/mcp_cronos/tools/settimana.py +103 -0
  29. mcp_cronos-1.0.0/src/mcp_cronos/tools/standup.py +174 -0
  30. mcp_cronos-1.0.0/src/mcp_cronos/utils/__init__.py +23 -0
  31. mcp_cronos-1.0.0/src/mcp_cronos/utils/dates.py +139 -0
  32. mcp_cronos-1.0.0/src/mcp_cronos/utils/markdown.py +342 -0
  33. mcp_cronos-1.0.0/tests/__init__.py +0 -0
  34. mcp_cronos-1.0.0/tests/conftest.py +123 -0
  35. mcp_cronos-1.0.0/tests/test_aggiungi_progetto.py +96 -0
  36. mcp_cronos-1.0.0/tests/test_cerca.py +65 -0
  37. mcp_cronos-1.0.0/tests/test_config.py +392 -0
  38. mcp_cronos-1.0.0/tests/test_consolida.py +72 -0
  39. mcp_cronos-1.0.0/tests/test_dates.py +149 -0
  40. mcp_cronos-1.0.0/tests/test_entries.py +101 -0
  41. mcp_cronos-1.0.0/tests/test_fine_giornata.py +68 -0
  42. mcp_cronos-1.0.0/tests/test_i18n.py +218 -0
  43. mcp_cronos-1.0.0/tests/test_markdown.py +209 -0
  44. mcp_cronos-1.0.0/tests/test_reader.py +60 -0
  45. mcp_cronos-1.0.0/tests/test_scrivi.py +111 -0
  46. mcp_cronos-1.0.0/tests/test_settimana.py +54 -0
  47. mcp_cronos-1.0.0/tests/test_standup.py +73 -0
  48. mcp_cronos-1.0.0/tests/test_template_loader.py +131 -0
  49. mcp_cronos-1.0.0/tests/test_templates.py +212 -0
@@ -0,0 +1,20 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ publish:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ id-token: write
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+ - run: pip install build
19
+ - run: python -m build
20
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,73 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+
27
+ # PyInstaller
28
+ *.manifest
29
+ *.spec
30
+
31
+ # Installer logs
32
+ pip-log.txt
33
+ pip-delete-this-directory.txt
34
+
35
+ # Unit test / coverage reports
36
+ htmlcov/
37
+ .tox/
38
+ .nox/
39
+ .coverage
40
+ .coverage.*
41
+ .cache
42
+ nosetests.xml
43
+ coverage.xml
44
+ *.cover
45
+ *.py,cover
46
+ .hypothesis/
47
+ .pytest_cache/
48
+
49
+ # Translations
50
+ *.mo
51
+ *.pot
52
+
53
+ # Environments
54
+ .env
55
+ .venv
56
+ env/
57
+ venv/
58
+ ENV/
59
+ env.bak/
60
+ venv.bak/
61
+
62
+ # IDE
63
+ .idea/
64
+ .vscode/
65
+ *.swp
66
+ *.swo
67
+ *~
68
+
69
+ # UV
70
+ uv.lock
71
+
72
+ # macOS
73
+ .DS_Store
@@ -0,0 +1,228 @@
1
+ # CLAUDE.md
2
+
3
+ Guide for Claude Code - mcp-cronos: MCP server for daily work diary management.
4
+
5
+ ## Quick Reference
6
+
7
+ ```bash
8
+ # Install dependencies
9
+ uv sync
10
+
11
+ # Run the server locally
12
+ uv run mcp-cronos
13
+
14
+ # Run tests
15
+ uv run pytest
16
+
17
+ # Format
18
+ uv run ruff format src/mcp_cronos/
19
+
20
+ # Lint
21
+ uv run ruff check src/mcp_cronos/
22
+ ```
23
+
24
+ ## Architecture
25
+
26
+ **Stack**: Python 3.10+ | MCP SDK (mcp.server) | Pydantic 2.x | dataclasses | pathlib
27
+
28
+ **Package**: `src/mcp_cronos/`
29
+
30
+ ```
31
+ src/mcp_cronos/
32
+ __init__.py # Package entry point, version
33
+ server.py # MCP server, tool definitions and dispatch (11 tools)
34
+ config.py # Configuration: TOML loading, CronosConfig singleton
35
+ i18n.py # Language packs (Italian, English), LanguagePack dataclass
36
+ template_loader.py # LLM template loading with user override support
37
+ templates.py # Dataclasses (Entry, Riferimento, DiarioGiornaliero), markdown generation
38
+ default_templates/ # Built-in LLM prompt templates
39
+ fine_giornata.md # End-of-day style instructions
40
+ standup.md # Standup message style instructions
41
+ consolida.md # Consolidation style instructions
42
+ tools/
43
+ entries.py # cronos_aggiungi_entry, cronos_imposta_bloccanti
44
+ reader.py # cronos_leggi_diario, cronos_lista_progetti
45
+ standup.py # cronos_riassunto_standup
46
+ fine_giornata.py # cronos_fine_giornata (end-of-day with LLM instructions)
47
+ scrivi_fine_giornata.py # cronos_scrivi_fine_giornata (write + git commit/push)
48
+ consolida.py # cronos_consolida_diario
49
+ cerca.py # cronos_cerca (full-text search with regex)
50
+ settimana.py # cronos_settimana (weekly summary by project)
51
+ aggiungi_progetto.py # cronos_aggiungi_a_progetto (append to existing entry)
52
+ utils/
53
+ dates.py # Date parsing, file path calculation, standup title (i18n-aware)
54
+ markdown.py # Diary file parsing, entry extraction, markdown rendering
55
+ ```
56
+
57
+ **Design pattern**: the server is synchronous (no async tool logic). Tools read/write markdown files directly via pathlib. Tools that require LLM reasoning (fine_giornata, consolida, standup) return raw data + style instructions — the LLM generates the output.
58
+
59
+ **Configuration system**:
60
+ - `CRONOS_DIARIO_PATH` (env var, mandatory): path to diary root directory
61
+ - `CRONOS_CONFIG_PATH` (env var, optional): explicit path to config file
62
+ - `cronos.toml` (searched in diary root or `~/.config/cronos/`): language, section names, git settings, template overrides
63
+ - Priority: user config > language defaults > Italian defaults
64
+
65
+ **i18n**: built-in Italian (default) and English. Section names, month/weekday names, temporal strings, and blockers default are all language-aware. LLM templates use `{section_*}` placeholders resolved at runtime.
66
+
67
+ **Tool workflow**:
68
+ - Daily entries: `cronos_aggiungi_entry` / `cronos_aggiungi_a_progetto` (append to existing)
69
+ - Reading: `cronos_leggi_diario` / `cronos_cerca` / `cronos_lista_progetti` / `cronos_settimana`
70
+ - End of day: `cronos_fine_giornata` -> LLM generates content -> `cronos_scrivi_fine_giornata` (+ git commit/push)
71
+ - Consolidation: `cronos_consolida_diario` -> LLM rewrites -> file write
72
+ - Standup: `cronos_riassunto_standup` -> LLM generates message
73
+
74
+ **Diary file structure**: `{CRONOS_DIARIO_PATH}/{year}/{month}/{year}-{month}-{day}.md`
75
+
76
+ ## Agent Rules
77
+
78
+ ### CRITICAL: Understand Before Implementing
79
+
80
+ Before writing any code, invest time in understanding the full context: how the existing system works, why it works that way, and what already exists. Read the affected files thoroughly. Never assume — verify in source code.
81
+
82
+ ### CRITICAL: Verify Before Asserting
83
+
84
+ Never present assumptions or hypotheses as verified facts. If something has not been verified in source code, say so explicitly.
85
+
86
+ ### Core Behavior
87
+
88
+ - **Read CLAUDE.md first** before starting any task
89
+ - **Read and understand existing files** before modifying code
90
+ - Avoid over-engineering: only implement what is requested
91
+ - Prefer editing existing files over creating new ones
92
+ - All code, comments, docstrings, and documentation in **English**
93
+ - PEP 8 with 100 character line limit (as per ruff config), double quotes
94
+ - Tests: **zero failing tests**
95
+
96
+ ### Execution Discipline
97
+
98
+ 1. **Plan before acting**: understand the codebase context, then act
99
+ 2. **Understand before implementing**: never start coding before understanding the existing system
100
+ 3. **Verify before asserting**: never state something as fact without checking source code
101
+ 4. **Handle errors, do not ignore them**: read error messages carefully, diagnose root cause, fix and re-test
102
+ 5. **Ask for clarification when needed**: if requirements are ambiguous, ask before proceeding
103
+
104
+ ### Code Comments and Docstrings
105
+
106
+ - **Language**: English, professional and precise
107
+ - **No emoji** in any context
108
+ - **Docstring content**: explain the "why" beyond the "what". Document non-obvious technical decisions
109
+
110
+ ### Documentation Sync
111
+
112
+ After any code change, update all affected documentation **in the same commit**:
113
+ - **Docstrings**: update if method signature, behavior, or return value changed
114
+ - **README.md**: update if the change affects tools, configuration, or usage
115
+
116
+ ### Mandatory Code Review
117
+
118
+ After writing any code, **before proposing a commit**, perform a thorough review:
119
+
120
+ 1. **Pythonic style**: clean, idiomatic Python
121
+ 2. **DRY violations**: duplicated logic that can be extracted
122
+ 3. **Exception handling**: specific exceptions, no bare `except Exception` if the expected type is known
123
+ 4. **Codebase consistency**: naming, patterns, type annotations
124
+ 5. **Security**: no sensitive data in logs, no command injection, no unvalidated external input
125
+ 6. **Documentation**: docstrings updated, README updated if needed
126
+
127
+ Fix issues before committing. Report what was found and corrected.
128
+
129
+ ## Mandatory Rules
130
+
131
+ ### Security
132
+
133
+ - NEVER log API keys, tokens, or credentials
134
+ - NEVER include hardcoded secrets in source code
135
+ - Validate all tool input parameters
136
+ - File operations are restricted to paths under `CRONOS_DIARIO_PATH`
137
+
138
+ ### Test Quality
139
+
140
+ - Zero failing tests
141
+ - Test each tool function independently
142
+ - Test edge cases: missing files, invalid dates, empty diary, malformed markdown
143
+ - Test both "file exists" and "file does not exist" paths
144
+
145
+ ### Git Commits
146
+
147
+ ```
148
+ type(scope): brief description
149
+
150
+ CHANGE: Technical explanation.
151
+ ```
152
+
153
+ Types: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`
154
+ Scope: module name (e.g. `server`, `entries`, `reader`, `standup`, `fine_giornata`, `consolida`, `cerca`, `settimana`, `dates`, `markdown`, `templates`, `config`)
155
+
156
+ **FORBIDDEN**: References to Claude/AI, emoji, Co-Authored-By, attribution lines.
157
+
158
+ ## Conventions
159
+
160
+ ### Adding a New Tool
161
+
162
+ 1. Create tool function in `tools/` (new file or existing, depending on domain)
163
+ 2. Add `Tool(...)` definition in `server.py` `TOOLS` list with full description and inputSchema
164
+ 3. Add handler case in `call_tool()` dispatch in `server.py`
165
+ 4. Import the function in `server.py`
166
+ 5. Update `__init__.py` docstring
167
+ 6. Update `README.md` tool section
168
+ 7. Add tests
169
+
170
+ ### Modifying an Existing Tool
171
+
172
+ 1. Update the function in `tools/`
173
+ 2. If parameters changed, update `inputSchema` in `server.py`
174
+ 3. If description changed, update `Tool.description` in `server.py`
175
+ 4. Update tests
176
+
177
+ ### Diary File Format
178
+
179
+ Section names are configurable via `cronos.toml` and i18n. Default (Italian):
180
+
181
+ ```markdown
182
+ # Per lo Stand-up {Day+1} {Month} {Year}
183
+
184
+ ## Cosa ho fatto ieri
185
+
186
+ ### {Project} - {Description}
187
+
188
+ {Intro paragraph}
189
+
190
+ {Content}
191
+
192
+ **Riferimenti:**
193
+ - Repository: name
194
+ - Branch: `branch`
195
+ - Jira: [TICKET](url)
196
+ - GitLab MR: [MR !123](url)
197
+
198
+ ---
199
+
200
+ ## Bloccanti
201
+
202
+ Nessuno
203
+ ```
204
+
205
+ The title uses the next day's date (standup convention). Months and section names follow the configured language. Entries are separated by `---`. The blockers section is always at the end.
206
+
207
+ ### Adding a New Language
208
+
209
+ 1. Add a `LanguagePack` entry in `i18n.py` `LANGUAGES` dict
210
+ 2. Provide: months, weekdays, title_prefix, date_format, sections, blockers_default, temporal
211
+ 3. Add tests in `tests/test_i18n.py`
212
+ 4. Update README.md
213
+
214
+ ### End-of-Day Workflow
215
+
216
+ The end-of-day process is a two-step tool workflow:
217
+
218
+ 1. `cronos_fine_giornata` reads raw entries and returns them with detailed style instructions
219
+ 2. The LLM generates the restructured content (5 sections: entries, daily summary, technical summary, standup message, blockers)
220
+ 3. `cronos_scrivi_fine_giornata` writes the generated content to the file
221
+
222
+ After writing the end-of-day file, commit and push the diary changes.
223
+
224
+ ## Known Limitations
225
+
226
+ - **Synchronous I/O**: all file operations are synchronous (pathlib read/write). Acceptable for single-user local diary.
227
+ - **No file locking**: concurrent writes to the same diary file could conflict. Not an issue for single-user use.
228
+ - **Tool dispatch is manual**: `call_tool()` uses if/elif chains instead of a registry. Acceptable for 11 tools.
@@ -0,0 +1,192 @@
1
+ # Formato Diario - Guida ed Esempi
2
+
3
+ ## Struttura Consigliata
4
+
5
+ Usa questa gerarchia per strutturare le entry del diario:
6
+
7
+ - `#` (H1): Titolo del file "Per lo Stand-up {Data}"
8
+ - `##` (H2): Sezioni principali "Cosa ho fatto ieri" e "Bloccanti"
9
+ - `###` (H3): Entry principali "{Progetto} - {Descrizione}"
10
+ - `####` (H4): Sottosezioni/dettagli della entry (opzionale ma consigliato)
11
+
12
+ ---
13
+
14
+ ## Esempio 1: Code Review
15
+
16
+ ```markdown
17
+ ### SmarTicket - Code Review MR #211 - Vouchers table improvements
18
+
19
+ Effettuata code review della MR #211 che implementa miglioramenti alla sezione voucher della vendor dashboard: separazione in due tabelle (voucher con prodotti e voucher con acquisti), aggiunta filtri e bottone reinvio email.
20
+
21
+ #### Problemi Identificati
22
+
23
+ 1. **CSRF su ResendVoucherEmailView**: l'invio email usa GET invece di POST con CSRF token
24
+ 2. **ListView contract violation**: get_queryset() restituisce una lista invece di un QuerySet
25
+
26
+ Pubblicato commento di review su GitLab MR e su Jira DVT-359.
27
+
28
+ **Riferimenti:**
29
+ - Repository: smarticket_project
30
+ - Branch: `improvements/display-vouchers-table-with-purchases`
31
+ - Jira: [DVT-359](https://mimmo7.atlassian.net/browse/DVT-359)
32
+ - Gitlab Mr: [MR !211](https://gitlab.greenshare.it/arrow_to_go/smarticket_project/-/merge_requests/211)
33
+ ```
34
+
35
+ **Risultato messaggio Slack:**
36
+ > **SmarTicket** - Code review MR #211 di Anton (miglioramenti tabella voucher): richieste modifiche per vulnerabilità CSRF sul reinvio email (usa GET invece di POST) e perché usa ListView per gestire due tabelle separate quando serve TemplateView.
37
+
38
+ ---
39
+
40
+ ## Esempio 2: Bug Fix con Deploy
41
+
42
+ ```markdown
43
+ ### SmarTicket - Fix filtro date default in vendor_dashboard/purchases/v4
44
+
45
+ Risolto bug nel filtro date della pagina purchases/v4 del vendor dashboard. Il filtro non mostrava le vendite di oggi quando si accedeva alla pagina senza impostare un range di date.
46
+
47
+ #### Causa del Bug
48
+
49
+ - Variabile `end_dt_max_seconds` creata prima che `end_dt` fosse impostata correttamente
50
+ - Uso di `timezone.now()` (UTC) invece del timezone locale (Europe/Rome)
51
+ - Il filtro cercava record nell'intervallo UTC invece che Europe/Rome
52
+
53
+ #### Fix Applicato
54
+
55
+ - Rimossa variabile `end_dt_max_seconds` (dead code)
56
+ - Aggiunto `timezone.localtime()` per convertire nel timezone locale
57
+ - Impostato `microsecond=999999` per coprire l'intera giornata
58
+
59
+ #### Deploy in Produzione (v3.125.4)
60
+
61
+ - ATPSS
62
+ - BDI
63
+ - Nuoro
64
+ - Sardegna
65
+ - TEP
66
+ - Turmo Travel
67
+ - Villasimius
68
+ - CTM
69
+ - Asti
70
+ - Casale
71
+
72
+ **Riferimenti:**
73
+ - Repository: smarticket_project
74
+ - Branch: `fix/DVT-382-vendor-dashboard-purchases-v4-date-filter`
75
+ - Jira: [DVT-382](https://mimmo7.atlassian.net/browse/DVT-382)
76
+ - Gitlab Mr: [MR !215](https://gitlab.greenshare.it/arrow_to_go/smarticket_project/-/merge_requests/215)
77
+ ```
78
+
79
+ **Risultato messaggio Slack:**
80
+ > **SmarTicket** - Risolto bug DVT-382 sul filtro date default in vendor_dashboard/purchases/v4 e deployato fix in produzione (v3.125.4) su tutti i vendor.
81
+
82
+ ---
83
+
84
+ ## Esempio 3: Task Generica
85
+
86
+ ```markdown
87
+ ### SmarTicket - Discussione integrazione documentazioni gestione campagne/abilitazioni
88
+
89
+ Discussione con Andrea su come integrare le nostre documentazioni relative alla gestione campagne e abilitazioni.
90
+
91
+ #### Punti Discussi
92
+
93
+ - Struttura unificata per documentazione tecnica e UX/UI
94
+ - Separazione tra developer docs e user-facing docs
95
+ - Template comuni per nuove feature
96
+
97
+ #### Prossimi Passi
98
+
99
+ - Creare struttura directory docs/
100
+ - Definire template markdown standard
101
+ - Revisionare docs esistenti
102
+ ```
103
+
104
+ **Risultato messaggio Slack:**
105
+ > **SmarTicket** - Discussione con Andrea sull'integrazione documentazioni gestione campagne/abilitazioni.
106
+
107
+ ---
108
+
109
+ ## Esempio 4: Task con "Richiesto da"
110
+
111
+ ```markdown
112
+ ### Infomobile - Ottimizzazione query GTFS real-time
113
+
114
+ *-Richiesto da Domenico-*
115
+
116
+ Ottimizzate le query per il recupero dei dati GTFS real-time riducendo il carico sul database.
117
+
118
+ #### Modifiche
119
+
120
+ - Aggiunto indice composito su (feed_id, trip_id, timestamp)
121
+ - Implementato caching Redis con TTL 30 secondi
122
+ - Refactoring query N+1 in bulk query
123
+
124
+ #### Risultati
125
+
126
+ - Tempo medio di risposta ridotto da 2.3s a 0.4s
127
+ - Carico CPU database ridotto del 60%
128
+
129
+ **Riferimenti:**
130
+ - Repository: infomobile_project
131
+ - Branch: `performance/gtfs-rt-query-optimization`
132
+ - Jira: [INF-123](https://mimmo7.atlassian.net/browse/INF-123)
133
+ ```
134
+
135
+ **Risultato messaggio Slack:**
136
+ > **Infomobile** - Ottimizzazione query GTFS real-time (richiesto da Domenico): ridotto tempo di risposta da 2.3s a 0.4s implementando caching Redis e indici compositi.
137
+
138
+ ---
139
+
140
+ ## Best Practices
141
+
142
+ ### ✅ Fare
143
+
144
+ 1. **Usare H3 per entry principali**: Ogni attività significativa è una entry H3
145
+ 2. **Usare H4 per dettagli**: Causa del bug, Fix applicato, Deploy, Problemi identificati, ecc.
146
+ 3. **Includere contesto**: Spiega brevemente cosa hai fatto e perché
147
+ 4. **Menzionare chi ha richiesto**: Se applicabile, usa `*-Richiesto da {Nome}-*`
148
+ 5. **Aggiungere riferimenti**: Branch, Jira, GitLab MR per tracciabilità
149
+
150
+ ### ❌ Evitare
151
+
152
+ 1. **NON usare H3 per dettagli tecnici**: "Causa del bug" non dovrebbe essere H3 separato
153
+ 2. **NON essere troppo verboso**: Il messaggio Slack sarà conciso, mantieni il focus
154
+ 3. **NON duplicare informazioni**: Se è nei riferimenti, non serve ripeterlo nel testo
155
+ 4. **NON usare template entry vuoto**: `{Progetto} - {Descrizione}` va rimosso
156
+
157
+ ---
158
+
159
+ ## Sottosezioni H4 Riconosciute dal Parser
160
+
161
+ Il parser raggruppa automaticamente queste sezioni H3 nella entry precedente:
162
+
163
+ - `Causa del bug` / `Cause del bug`
164
+ - `Fix applicato` / `Soluzione` / `Soluzione applicata`
165
+ - `Deploy in produzione` / `Deploy` / `Deployment`
166
+ - `Implementazione` / `Testing` / `Test`
167
+ - `Modifiche` / `Changes`
168
+
169
+ **Consiglio**: Usa H4 (`####`) per queste sezioni invece di H3 (`###`), così il formato è più chiaro semanticamente.
170
+
171
+ ---
172
+
173
+ ## Migrazione Entry Esistenti
174
+
175
+ Se hai entry vecchie con H3 per i dettagli, NON devi modificarle manualmente. Il parser le raggrupperà automaticamente. Ma per il futuro, usa la struttura con H4 consigliata sopra.
176
+
177
+ ---
178
+
179
+ ## Come Verificare il Risultato
180
+
181
+ Dopo aver scritto il diario, puoi testare il messaggio generato con:
182
+
183
+ ```bash
184
+ # Da Claude CLI
185
+ mcp__cronos__cronos_genera_slack_domenico
186
+ ```
187
+
188
+ Il messaggio dovrebbe essere:
189
+ - Conciso (1-3 righe per progetto)
190
+ - Professionale ma amichevole
191
+ - Con dettagli rilevanti (autore MR, problemi trovati, vendor deployati)
192
+ - Senza riferimenti tecnici (branch, ticket Jira)