@noeva/analytics-core 0.1.0 → 0.3.1

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,48 @@
3
3
  Le versioni del pacchetto che i repository dei progetti installano (ADR 0005). Prima di
4
4
  `analytics upgrade` si legge cosa cambia fra la versione installata e la nuova.
5
5
 
6
+ ## 0.3.1 — 6 novembre 2026
7
+
8
+ - `analytics pubblica` non segue piu' i redirect: un contenitore senza la rotta
9
+ `/_pagine/` manda al login con un 302, e la 0.3.0 prendeva la pagina di login (200)
10
+ per una pubblicazione riuscita. Ora si ferma e dice che il contenitore va deployato;
11
+ una risposta vale solo se e' il `{ok: true}` del contenitore.
12
+
13
+ ## 0.3.0 — 6 novembre 2026
14
+
15
+ Il repository del progetto basta a se stesso (ADR 0005): pubblica pagine e modello e
16
+ rilascia i due eseguibili Windows senza il monorepo.
17
+
18
+ - `analytics pubblica` e `analytics modello` chiedono il biglietto all'API NOEVA con la
19
+ chiave di un membro del workspace (`NOEVA_API_KEY` o `~/.noeva-api-key`) quando il
20
+ segreto del contenitore non c'e'. Serve l'API con il campo `tipo` del biglietto
21
+ (noeva-server-api, `POST /api/analytics/biglietto-dati`).
22
+ - `.github/workflows/ci.yml` (gestito): il job `pubblica` porta online pagine e modello a
23
+ ogni push su `main` che passa la verifica. Si accende con il secret `NOEVA_API_KEY` e
24
+ la variabile `ANALYTICS_PUBBLICA=si`.
25
+ - `.github/workflows/rilascio-windows.yml` (gestito): la cartella MCP per i PC e
26
+ l'eseguibile degli snapshot, costruiti e provati su Windows, e le release nel repository
27
+ del progetto. Le ricette sono nel pacchetto (`contenuto/lib/mcp-locale`,
28
+ `contenuto/lib/snapshot`) e leggono `consegna.yml`, che ora e' la configurazione di
29
+ consegna intera: cliente, connessione senza password, verifiche, trasformazioni.
30
+ - La pubblicazione dei dati (`aggiorna.sh --pubblica`) trova il workspace in
31
+ `analytics.json`: fuori dal monorepo il registro non c'e'.
32
+ - `.gitignore` del modello: `dist/`, dove escono le cartelle Windows.
33
+
34
+ ## 0.2.0 — 6 novembre 2026
35
+
36
+ - `analytics pubblica --url <url>`: la `apps/` del commit (HEAD, non il disco) sul
37
+ contenitore, in R2, meno quello che `apps/.assetsignore` esclude (ADR 0005, punto 3).
38
+ `--prova` elenca soltanto. In prova il biglietto si firma col segreto del contenitore
39
+ (`SEGRETO_DATI` o `~/.segreto-dati`); quello rilasciato dall'API NOEVA alla CI non c'e'
40
+ ancora.
41
+ - `analytics modello --url <url>`: il modello del commit (wren_project.yml, relationships.yml,
42
+ models/, knowledge/), con le trasformazioni di `consegna.yml`, compilato come `wren context
43
+ build` e pubblicato su R2 per il servizio locale (ADR 0005, punto 6). Vuole python3 con
44
+ pyyaml e wrenai (il contenitore di sviluppo li ha); `--prova` compila soltanto.
45
+ - `analytics.json` accetta `workspace`: il workspace NOEVA che possiede il progetto, che il
46
+ biglietto nomina.
47
+
6
48
  ## 0.1.0 — 6 novembre 2026
7
49
 
8
50
  Prima versione, per la prima prova dell'ADR 0005.
package/README.md CHANGED
@@ -15,6 +15,10 @@ python3 lib/rilascio/estrai-progetto.py <id> <cartella vuota> # un progetto
15
15
 
16
16
  - **Il pacchetto non nomina clienti**: `test/nomi.test.js` lo prova contro il registro.
17
17
  Un commento in `lib/pagina` o `lib/snapshot` che cita un cliente arriva a tutti.
18
+ - **La CI del repository nuovo puo' non partire**: con OIKI (6/11/2026) GitHub ha registrato
19
+ `ci.yml`, arrivato col push che crea il repository, ma non partiva su push e PR, solo a mano.
20
+ Si e' sbloccato al primo push di un commit che cambiava `ci.yml`, anche su un branch di
21
+ prova poi cancellato. Dopo il primo push si controlla che la PR abbia il check `verifica`.
18
22
  - **Una versione nuova** si scrive in `package.json` e in `CHANGELOG.md`, che i progetti
19
23
  leggono prima di aggiornare. Pubblicare su npm lo fa Stefano Denti, come i rilasci
20
24
  (`AGENTS.md`, «Chi rilascia»).
package/cli.js CHANGED
@@ -6,6 +6,8 @@
6
6
  // analytics upgrade --check la versione installata, l'ultima, i file gestiti cambiati
7
7
  // analytics upgrade aggiorna il pacchetto e riscrive i file gestiti
8
8
  // analytics agent sync riscrive solo il kit dell'agente
9
+ // analytics pubblica --url <url> la apps/ di HEAD sul contenitore, in R2 (--prova: elenca soltanto)
10
+ // analytics modello --url <url> il modello di HEAD, compilato, sul contenitore in R2 (python3, wren)
9
11
  // analytics percorso dove sta il contenuto del pacchetto (per aggiorna.sh)
10
12
  // analytics versione
11
13
  //
@@ -15,8 +17,9 @@ import { execFileSync } from 'node:child_process';
15
17
  import { join, resolve } from 'node:path';
16
18
  import {
17
19
  ErroreConfig, PACCHETTO, VERSIONE, derive, init, leggiConfig, scriviGestiti, trovaRadice,
18
- ultimaVersione, verifica,
20
+ piuNuova, ultimaVersione, verifica,
19
21
  } from './core.js';
22
+ import { pubblica } from './pubblica.js';
20
23
 
21
24
  const verde = (s) => `\x1b[0;32m${s}\x1b[0m`;
22
25
  const rosso = (s) => `\x1b[0;31m${s}\x1b[0m`;
@@ -46,7 +49,7 @@ async function principale(argv) {
46
49
  elenca(giallo('avvisi'), avvisi);
47
50
  elenca(rosso('errori'), errori);
48
51
  const ultima = await ultimaVersione();
49
- if (ultima && ultima !== VERSIONE) console.log(giallo(`c'e' la versione ${ultima}: npx analytics upgrade --check`));
52
+ if (piuNuova(ultima, VERSIONE)) console.log(giallo(`c'e' la versione ${ultima}: npx analytics upgrade --check`));
50
53
  console.log(errori.length ? rosso(`KO: ${errori.length} errori`) : verde('ok'));
51
54
  return errori.length ? 1 : 0;
52
55
  }
@@ -56,7 +59,7 @@ async function principale(argv) {
56
59
  if (resto.includes('--check')) {
57
60
  const ultima = await ultimaVersione();
58
61
  console.log(`installata ${VERSIONE}, ultima ${ultima ?? 'non raggiungibile o non pubblicata'}`);
59
- if (ultima && ultima !== VERSIONE) console.log(`il registro delle modifiche: npm view @noeva/analytics-core@${ultima} — leggerlo prima di aggiornare`);
62
+ if (piuNuova(ultima, VERSIONE)) console.log(`il registro delle modifiche: npm view @noeva/analytics-core@${ultima} — leggerlo prima di aggiornare`);
60
63
  const d = derive(radice, config);
61
64
  elenca(giallo('file gestiti diversi dal pacchetto installato'), d.map((x) => `${x.stato}: ${x.percorso}`));
62
65
  if (!d.length) console.log(verde('file gestiti allineati'));
@@ -80,6 +83,33 @@ async function principale(argv) {
80
83
  console.log(verde('kit allineato'));
81
84
  return 0;
82
85
  }
86
+ case 'pubblica': {
87
+ const radice = trovaRadice();
88
+ const config = leggiConfig(radice);
89
+ const valore = (nome) => { const i = resto.indexOf(nome); return i >= 0 ? resto[i + 1] : undefined; };
90
+ const prova = resto.includes('--prova');
91
+ const esito = await pubblica(radice, config, {
92
+ url: valore('--url') ?? process.env.NOEVA_ANALYTICS_URL,
93
+ workspace: valore('--workspace') ?? config.workspace,
94
+ prova,
95
+ stampa: console.log,
96
+ });
97
+ const quanto = `${esito.file} file, ${Math.round(esito.byte / 1024)} kB`;
98
+ console.log(prova ? `versione ${esito.versione}: ${quanto} (prova, niente caricato)` : verde(`pubblicata ${esito.versione}: ${quanto}`));
99
+ return 0;
100
+ }
101
+ case 'modello': {
102
+ // Compilare il modello e' di wren, che e' Python: lo fa lib/modello/pubblica.py
103
+ // del pacchetto, con il python3 dell'ambiente (il contenitore di sviluppo, la CI).
104
+ const radice = trovaRadice();
105
+ const script = join(PACCHETTO, 'contenuto', 'lib', 'modello', 'pubblica.py');
106
+ try {
107
+ execFileSync(process.env.PYTHON || 'python3', [script, radice, ...resto], { stdio: 'inherit' });
108
+ } catch (e) {
109
+ return e.status ?? 1;
110
+ }
111
+ return 0;
112
+ }
83
113
  case 'percorso':
84
114
  console.log(join(PACCHETTO, 'contenuto'));
85
115
  return 0;
@@ -89,7 +119,7 @@ async function principale(argv) {
89
119
  return 0;
90
120
  default:
91
121
  }
92
- console.error('uso: analytics init <id> [cartella] | ci | upgrade [--check] | agent sync | percorso | versione');
122
+ console.error('uso: analytics init <id> [cartella] | ci | upgrade [--check] | agent sync | pubblica --url <url> [--prova] | modello --url <url> [--prova] | percorso | versione');
93
123
  return 2;
94
124
  }
95
125
 
@@ -0,0 +1,23 @@
1
+ # Le dipendenze esatte dell'eseguibile noeva-<progetto> (lib/mcp-locale/costruisci.py).
2
+ # Il lock e' universale: Windows installa le stesse versioni provate sul Mac e nel
3
+ # container. Le versioni del server sono quelle del Dockerfile; mcp<2 per lo
4
+ # stesso motivo (wrenai importa mcp.server.fastmcp, tolto nell'SDK 2.x).
5
+ [project]
6
+ name = "noeva-mcp-locale"
7
+ version = "0.1.0"
8
+ requires-python = "==3.11.*"
9
+ dependencies = [
10
+ "wrenai[mcp]==0.15.0",
11
+ "wren-core-py==0.8.0",
12
+ "mcp[cli]>=1.19,<2",
13
+ "duckdb==1.5.6",
14
+ "pyodbc>=5,<6",
15
+ "pyyaml>=6",
16
+ ]
17
+
18
+ [dependency-groups]
19
+ build = ["pyinstaller==6.16.0"]
20
+
21
+ [tool.uv]
22
+ package = false
23
+ default-groups = ["build"]