{"_id":"@aborruso/worklimate","_rev":"4-bf9d44046b9c556b5da0131c462d390e","name":"@aborruso/worklimate","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.0":{"name":"@aborruso/worklimate","version":"0.1.0","keywords":["worklimate","heat-stress","wbgt","caldo","lavoro","climate","cli","italy"],"author":{"name":"Andrea Borruso","email":"aborruso@gmail.com"},"license":"MIT","_id":"@aborruso/worklimate@0.1.0","maintainers":[{"name":"aborruso","email":"aborruso@gmail.com"}],"homepage":"https://github.com/aborruso/worklimate#readme","bugs":{"url":"https://github.com/aborruso/worklimate/issues"},"bin":{"worklimate":"src/cli.js"},"dist":{"shasum":"a06cf4f3d605610d8e5ce891e84733b7d2e96f6c","tarball":"https://registry.npmjs.org/@aborruso/worklimate/-/worklimate-0.1.0.tgz","fileCount":6,"integrity":"sha512-3otkkrjBbcEkYhOnP30LY1S/YM5zovmaWUGP5f91h9vD8s9u5AS5Vy+w8kWBjBHPu9x7QYBFyqS7p/qZOw0zcg==","signatures":[{"sig":"MEUCIQCCaHuMF740ShRSvSF0xDnEvW59wR5f1YInv7eOasYKigIgEKURCfXfUrx32S19BnC+LA62xTmj25qd9hJXiLchjIA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19725},"main":"src/api.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/api.js"},"gitHead":"0fe792630c7e249438842185c650223041fcfe3c","scripts":{"start":"node src/cli.js"},"_npmUser":{"name":"aborruso","email":"aborruso@gmail.com"},"repository":{"url":"git+https://github.com/aborruso/worklimate.git","type":"git"},"_npmVersion":"11.16.0","description":"CLI per leggere i dati di stress da caldo Worklimate: stazione più vicina, rischio odierno e storico stagionale. Pensata per essere orchestrata da un LLM.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"citty":"^0.1.6","cli-table3":"^0.6.5","picocolors":"^1.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/worklimate_0.1.0_1783925851706_0.24031070287605782","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aborruso/worklimate","version":"0.2.0","keywords":["worklimate","heat-stress","wbgt","caldo","lavoro","climate","cli","italy"],"author":{"name":"Andrea Borruso","email":"aborruso@gmail.com"},"license":"MIT","_id":"@aborruso/worklimate@0.2.0","maintainers":[{"name":"aborruso","email":"aborruso@gmail.com"}],"homepage":"https://github.com/aborruso/worklimate#readme","bugs":{"url":"https://github.com/aborruso/worklimate/issues"},"bin":{"worklimate":"src/cli.js"},"dist":{"shasum":"cc975abefc06586c4eb5e0205a14a648ba948343","tarball":"https://registry.npmjs.org/@aborruso/worklimate/-/worklimate-0.2.0.tgz","fileCount":6,"integrity":"sha512-E0BtqMWSM2z3hIXPntvYjlm2ZG8OoVANSblRjCitNWdKymE5U4rkaHVxJRtUM2/VIwQd76gWCACXZPrr1Hj5Ew==","signatures":[{"sig":"MEQCIEMBiO9mZsFKYhNNJfJV02mTnxPDtM//Y/qHk28R7TVFAiBeOw/UDMYydHi4tilhCUNOGmqY3dl6AkV9V1Mo9WqXdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21068},"main":"src/api.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/api.js"},"gitHead":"8b6cd4e3cdb30f65bfbb0d76b8c45818dd278372","scripts":{"start":"node src/cli.js"},"_npmUser":{"name":"aborruso","email":"aborruso@gmail.com"},"repository":{"url":"git+https://github.com/aborruso/worklimate.git","type":"git"},"_npmVersion":"11.16.0","description":"CLI per leggere i dati di stress da caldo Worklimate: stazione più vicina, rischio odierno e storico stagionale. Pensata per essere orchestrata da un LLM.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"citty":"^0.1.6","cli-table3":"^0.6.5","picocolors":"^1.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/worklimate_0.2.0_1783927063994_0.051720712555370474","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@aborruso/worklimate","version":"0.2.1","keywords":["worklimate","heat-stress","wbgt","caldo","lavoro","climate","cli","italy"],"author":{"name":"Andrea Borruso","email":"aborruso@gmail.com"},"license":"MIT","_id":"@aborruso/worklimate@0.2.1","maintainers":[{"name":"aborruso","email":"aborruso@gmail.com"}],"homepage":"https://github.com/aborruso/worklimate#readme","bugs":{"url":"https://github.com/aborruso/worklimate/issues"},"bin":{"worklimate":"src/cli.js"},"dist":{"shasum":"65e8b20deedba62863c20c5e148414333dc89085","tarball":"https://registry.npmjs.org/@aborruso/worklimate/-/worklimate-0.2.1.tgz","fileCount":6,"integrity":"sha512-ZZUNlwy94Dnycp6eVDyWtthMkaI7IwHQN6fjfvnqEtJHYphH46DVcq9T3Y3gg341jb10wWChfsa3NIdR3otFcA==","signatures":[{"sig":"MEUCIDVK9HqhtqsqNeAFTA+oiM8XHVN3tXrUivKfx3+0GFAXAiEA1VSGOHpOvHXvpmnk51nvtAkzq/7BGoZFB2HbbkjisMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21064},"main":"src/api.js","type":"module","engines":{"node":">=18"},"exports":{".":"./src/api.js"},"gitHead":"f8fd45454cf5ff51591930fb0e9f5f8b6d659d6b","scripts":{"start":"node src/cli.js"},"_npmUser":{"name":"aborruso","email":"aborruso@gmail.com"},"repository":{"url":"git+https://github.com/aborruso/worklimate.git","type":"git"},"_npmVersion":"11.16.0","description":"CLI per leggere i dati di stress da caldo Worklimate: stazione più vicina, rischio odierno e storico stagionale. Pensata per essere orchestrata da un LLM.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"citty":"^0.1.6","cli-table3":"^0.6.5","picocolors":"^1.1.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/worklimate_0.2.1_1783930875745_0.15990998579777238","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aborruso/worklimate","version":"0.2.2","description":"CLI per leggere i dati di stress da caldo Worklimate: stazione più vicina, rischio odierno e storico stagionale. Pensata per essere orchestrata da un LLM.","type":"module","main":"src/api.js","bin":{"worklimate":"src/cli.js"},"exports":{".":"./src/api.js"},"scripts":{"start":"node src/cli.js"},"keywords":["worklimate","heat-stress","wbgt","caldo","lavoro","climate","cli","italy"],"author":{"name":"Andrea Borruso","email":"aborruso@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/aborruso/worklimate.git"},"homepage":"https://github.com/aborruso/worklimate#readme","bugs":{"url":"https://github.com/aborruso/worklimate/issues"},"dependencies":{"citty":"^0.1.6","cli-table3":"^0.6.5","picocolors":"^1.1.1"},"engines":{"node":">=18"},"gitHead":"ed74529f0937dedd20674ef990199b58afba22e8","_id":"@aborruso/worklimate@0.2.2","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-ZG45FYlC6gU/znX/FHDQqzA2OgAAvyBxaVTDkTgtKU6xwNVD4YgAFjo4cBJrAO6IevGF3VnrIWaCPYJGtgjqcg==","shasum":"82d2566f64e1d018c64963b636772b63fec3cf99","tarball":"https://registry.npmjs.org/@aborruso/worklimate/-/worklimate-0.2.2.tgz","fileCount":6,"unpackedSize":23736,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCICNr8MUY8tYo2Vy1dtV4Hshp/ilWINOwjY77u7dURxh8AiEA3lYx8H0TWDwm3F36d5e5mgmSDuRXRduShwXIrnZz180="}]},"_npmUser":{"name":"aborruso","email":"aborruso@gmail.com"},"directories":{},"maintainers":[{"name":"aborruso","email":"aborruso@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/worklimate_0.2.2_1783939354764_0.4564176164605369"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-13T06:57:31.536Z","modified":"2026-07-13T10:42:34.976Z","0.1.0":"2026-07-13T06:57:31.834Z","0.2.0":"2026-07-13T07:17:44.175Z","0.2.1":"2026-07-13T08:21:15.889Z","0.2.2":"2026-07-13T10:42:34.886Z"},"bugs":{"url":"https://github.com/aborruso/worklimate/issues"},"author":{"name":"Andrea Borruso","email":"aborruso@gmail.com"},"license":"MIT","homepage":"https://github.com/aborruso/worklimate#readme","keywords":["worklimate","heat-stress","wbgt","caldo","lavoro","climate","cli","italy"],"repository":{"type":"git","url":"git+https://github.com/aborruso/worklimate.git"},"description":"CLI per leggere i dati di stress da caldo Worklimate: stazione più vicina, rischio odierno e storico stagionale. Pensata per essere orchestrata da un LLM.","maintainers":[{"name":"aborruso","email":"aborruso@gmail.com"}],"readme":"# worklimate\n\n[![npm version](https://img.shields.io/npm/v/@aborruso/worklimate.svg)](https://www.npmjs.com/package/@aborruso/worklimate)\n[![license](https://img.shields.io/npm/l/@aborruso/worklimate.svg)](./LICENSE)\n[![node](https://img.shields.io/node/v/@aborruso/worklimate.svg)](https://www.npmjs.com/package/@aborruso/worklimate)\n\nCLI per leggere i dati di **stress da caldo** di [Worklimate](https://www.worklimate.it): trova la stazione più vicina, consulta la previsione a 3 giorni e ricostruisci lo storico stagionale.\n\nPensata per essere usata sia da terminale (tabella colorata) sia **orchestrata da un LLM / script** (JSON e CSV stabili, comandi componibili).\n\n- 🔌 Nessuna autenticazione — usa gli endpoint pubblici di `app.worklimate.it` e `archivio.worklimate.it`\n- 🌍 Geocoding automatico via [Nominatim](https://nominatim.openstreetmap.org) / OpenStreetMap (digiti \"palermo\", non le coordinate) — [attribuzione e uso corretto](#geocoding-nominatim-e-openstreetmap)\n- 🤖 Output machine-friendly di default quando non sei in un terminale (pipe, script, agent)\n\n## Installazione\n\n```bash\nnpm install -g @aborruso/worklimate\n```\n\nOppure senza installare nulla:\n\n```bash\nnpx @aborruso/worklimate now palermo\n```\n\nRichiede Node.js ≥ 18.\n\n## Quickstart\n\n```bash\nworklimate search palermo          # stazione Worklimate più vicina\nworklimate now palermo             # previsione rischio caldo: oggi + 2 giorni\nworklimate now 305688              # …oppure direttamente per ID stazione (pgrid)\nworklimate history palermo         # storico da inizio stagione (28 apr) a oggi\nworklimate history palermo --from 2026-07-01 --to 2026-07-13\n```\n\n## Comandi\n\n### `search <luogo>`\n\nGeocoding + stazione più vicina. Restituisce `pgrid` (ID stazione), coordinate, distanza, altitudine, zona costiera.\n\n### `now <luogo | pgrid>`\n\nPrevisione del rischio da caldo per **3 giorni**: **oggi, domani, dopodomani**. Ogni giorno ha data, colore, etichetta (Basso / Moderato / Alto / Emergenza) e consiglio.\n\n- Se l'argomento è **numerico** (es. `305688`) → interrogazione diretta alla stazione.\n- Se è **testo** (es. `palermo`) → geocoding + stazione più vicina.\n\n### `history <luogo> [--from YYYY-MM-DD] [--to YYYY-MM-DD]`\n\nStorico giornaliero del livello di rischio.\n\n- `--from` default **2026-04-28** (primo giorno con dati Worklimate). Se passi una data precedente, viene clampata al 2026-04-28 con un warning.\n- `--to` default **oggi**.\n\n## Formati di output\n\nLa CLI sceglie in automatico in base al contesto:\n\n- **Terminale interattivo (TTY)** → tabella colorata\n- **Pipe / script / LLM (non-TTY)** → JSON\n\nPuoi forzare il formato con:\n\n- `--json` — JSON strutturato (ideale per `jq` e agent AI)\n- `--csv` — CSV con header\n- `--table` — tabella forzata anche in pipe\n\nPrecedenza: `--json` > `--csv` > `--table` > auto.\n\n## Schema JSON (per orchestrare con un LLM)\n\nTutti gli output JSON hanno uno schema stabile e prevedibile.\n\n**`search`**\n\n```json\n{\n  \"luogo\": \"Palermo\",\n  \"display_name\": \"Palermo, Sicilia, Italia\",\n  \"lat\": \"38.1112268\",\n  \"lon\": \"13.3524434\",\n  \"pgrid\": 305688,\n  \"distanza_km\": 1.3,\n  \"stazione\": { \"lat\": \"38.12\", \"lon\": \"13.36\", \"alt_m\": 102, \"costa\": true }\n}\n```\n\n**`now`**\n\n```json\n{\n  \"pgrid\": 305688,\n  \"giorni\": [\n    {\n      \"data\": \"2026-07-13\",\n      \"giorno_settimana\": \"lunedì\",\n      \"colore\": \"red\",\n      \"label\": \"Alto\",\n      \"desc\": \"…\",\n      \"longdesc\": \"…\"\n    }\n  ]\n}\n```\n\n**`history`**\n\n```json\n{\n  \"pgrid\": 305688,\n  \"dal\": \"2026-04-28\",\n  \"al\": \"2026-07-13\",\n  \"giorni\": [\n    { \"data\": \"2026-04-28\", \"giorno_anno\": 118, \"colore\": \"yellow\" }\n  ]\n}\n```\n\nValori possibili di `colore`: `green` (Basso), `yellow` (Moderato), `orange` (Alto), `red` (Emergenza).\n\n## Esempi di orchestrazione\n\nComponi i comandi a step — l'output di uno alimenta il successivo:\n\n```bash\n# 1. scopri la stazione più vicina e prendi il pgrid\nPGRID=$(worklimate search palermo --json | jq -r .pgrid)\n\n# 2. consulta la previsione a 3 giorni di quella stazione\nworklimate now \"$PGRID\" --json\n\n# 3. export dello storico in CSV per analisi\nworklimate history palermo --csv > palermo-storico.csv\n```\n\nUn agent AI può quindi: leggere il luogo dell'utente → `search` per ottenere `pgrid` → `now`/`history` → formattare la risposta. Ogni comando fa una cosa sola.\n\n## Comportamento in caso di errore\n\n- Luogo non trovato, HTTP non 200, JSON non valido → messaggio chiaro su **stderr**, **exit code 1**, stdout vuoto (così l'AI non riceve dati sporchi).\n- Warning tecnici (es. clamp della data) → su stderr, non inquinano stdout.\n- Nessuno stack trace esposto.\n\n## Fonte dei dati\n\nI dati provengono dagli endpoint pubblici (AJAX) di Worklimate:\n\n- `https://app.worklimate.it/osm-stazioni.php` — stazione vicina e previsione a 3 giorni\n- `https://archivio.worklimate.it/ajax-stazioni.php` — storico\n\nNessuna chiave API necessaria. I dati di rischio sono disponibili dalla stagione calda (fine aprile).\n\n## Geocoding, Nominatim e OpenStreetMap\n\nIl geocoding (nome luogo → coordinate) usa l'istanza pubblica **[Nominatim](https://nominatim.openstreetmap.org)** gestita dalla OpenStreetMap Foundation, che interroga i dati di **[OpenStreetMap](https://www.openstreetmap.org)**.\n\n**Attribuzione** — i risultati del geocoding sono derivati da dati OpenStreetMap:\n\n> © OpenStreetMap contributors\n\nI dati OpenStreetMap sono rilasciati sotto licenza **[ODbL](https://opendatacommons.org/licenses/odbl/)**. Vedi <https://www.openstreetmap.org/copyright>. La CLI mostra l'attribuzione ogni volta che esegue un geocoding: su stderr (`search`, `now <luogo>`, `history <luogo>`), in calce alla tabella e nel campo `attribution` del JSON di `search`.\n\n**Uso corretto (Nominatim Usage Policy)** — la CLI rispetta la [usage policy](https://operations.osmfoundation.org/policies/nominatim/) dell'istanza pubblica:\n\n- invia uno **User-Agent identificativo** (`worklimate/<versione>`), non un UA generico;\n- effettua **una sola richiesta per esecuzione**, ben entro il limite di 1 richiesta/secondo.\n\nQuesto strumento **non** è pensato per geocoding massivo o sistematico. Per volumi elevati, o per un uso di produzione, **ospita una tua istanza Nominatim** o usa un provider di geocoding a pagamento: l'istanza pubblica è una risorsa condivisa a titolo gratuito. La CLI non conserva una cache tra esecuzioni (una richiesta per processo); se ne integri il codice in loop su molti luoghi, aggiungi tu una cache come richiesto dalla policy.\n\n## Sviluppo\n\n```bash\ngit clone https://github.com/aborruso/worklimate.git\ncd worklimate\nnpm install\nnode src/cli.js now palermo --table\n```\n\nStruttura:\n\n```\nsrc/\n  cli.js      # entry (Citty): main + subcomandi + flag\n  api.js      # chiamate HTTP a Worklimate + Nominatim\n  format.js   # risoluzione formato (TTY-aware) + rendering table/json/csv\n```\n\n## Release\n\nRelease manuale, senza CI. Vedi [`docs/design.md`](./docs/design.md) per le decisioni architetturali.\n\n```bash\nnpm version patch            # bump versione\nnpm pack --dry-run           # verifica contenuto tarball\nnpm publish --access public  # pubblicazione (scoped)\ngit push --tags\ngh release create vX.Y.Z --notes \"...\"\n```\n\n## Licenza\n\n[MIT](./LICENSE) © Andrea Borruso\n\nI dati appartengono a Worklimate; questa CLI è un client non ufficiale che legge gli endpoint pubblici.\n","readmeFilename":"README.md"}