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.
- mcp_cronos-1.0.0/.github/workflows/publish.yml +20 -0
- mcp_cronos-1.0.0/.gitignore +73 -0
- mcp_cronos-1.0.0/CLAUDE.md +228 -0
- mcp_cronos-1.0.0/ESEMPIO_FORMATO_DIARIO.md +192 -0
- mcp_cronos-1.0.0/PKG-INFO +713 -0
- mcp_cronos-1.0.0/README.md +683 -0
- mcp_cronos-1.0.0/docs/plans/2026-04-01-cronos-refactor.md +1146 -0
- mcp_cronos-1.0.0/docs/plans/2026-04-09-public-release.md +1918 -0
- mcp_cronos-1.0.0/docs/specs/2026-04-09-public-release-design.md +251 -0
- mcp_cronos-1.0.0/pyproject.toml +62 -0
- mcp_cronos-1.0.0/src/mcp_cronos/__init__.py +16 -0
- mcp_cronos-1.0.0/src/mcp_cronos/config.py +232 -0
- mcp_cronos-1.0.0/src/mcp_cronos/default_templates/consolida.md +50 -0
- mcp_cronos-1.0.0/src/mcp_cronos/default_templates/fine_giornata.md +146 -0
- mcp_cronos-1.0.0/src/mcp_cronos/default_templates/standup.md +45 -0
- mcp_cronos-1.0.0/src/mcp_cronos/i18n.py +153 -0
- mcp_cronos-1.0.0/src/mcp_cronos/server.py +550 -0
- mcp_cronos-1.0.0/src/mcp_cronos/template_loader.py +54 -0
- mcp_cronos-1.0.0/src/mcp_cronos/templates.py +190 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/__init__.py +25 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/aggiungi_progetto.py +212 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/cerca.py +102 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/consolida.py +162 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/entries.py +221 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/fine_giornata.py +181 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/reader.py +192 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/scrivi_fine_giornata.py +128 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/settimana.py +103 -0
- mcp_cronos-1.0.0/src/mcp_cronos/tools/standup.py +174 -0
- mcp_cronos-1.0.0/src/mcp_cronos/utils/__init__.py +23 -0
- mcp_cronos-1.0.0/src/mcp_cronos/utils/dates.py +139 -0
- mcp_cronos-1.0.0/src/mcp_cronos/utils/markdown.py +342 -0
- mcp_cronos-1.0.0/tests/__init__.py +0 -0
- mcp_cronos-1.0.0/tests/conftest.py +123 -0
- mcp_cronos-1.0.0/tests/test_aggiungi_progetto.py +96 -0
- mcp_cronos-1.0.0/tests/test_cerca.py +65 -0
- mcp_cronos-1.0.0/tests/test_config.py +392 -0
- mcp_cronos-1.0.0/tests/test_consolida.py +72 -0
- mcp_cronos-1.0.0/tests/test_dates.py +149 -0
- mcp_cronos-1.0.0/tests/test_entries.py +101 -0
- mcp_cronos-1.0.0/tests/test_fine_giornata.py +68 -0
- mcp_cronos-1.0.0/tests/test_i18n.py +218 -0
- mcp_cronos-1.0.0/tests/test_markdown.py +209 -0
- mcp_cronos-1.0.0/tests/test_reader.py +60 -0
- mcp_cronos-1.0.0/tests/test_scrivi.py +111 -0
- mcp_cronos-1.0.0/tests/test_settimana.py +54 -0
- mcp_cronos-1.0.0/tests/test_standup.py +73 -0
- mcp_cronos-1.0.0/tests/test_template_loader.py +131 -0
- 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)
|