@noeva/analytics-core 0.1.0 → 0.3.2
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 +48 -0
- package/README.md +4 -0
- package/cli.js +34 -4
- package/contenuto/lib/mcp-locale/ambiente/.python-version +1 -0
- package/contenuto/lib/mcp-locale/ambiente/pyproject.toml +23 -0
- package/contenuto/lib/mcp-locale/ambiente/uv.lock +1103 -0
- package/contenuto/lib/mcp-locale/cartella/CLAUDE.md +52 -0
- package/contenuto/lib/mcp-locale/cartella/LEGGIMI.md +163 -0
- package/contenuto/lib/mcp-locale/cartella/imposta-password.ps1 +40 -0
- package/contenuto/lib/mcp-locale/cartella/installa.ps1 +286 -0
- package/contenuto/lib/mcp-locale/costruisci.py +495 -0
- package/contenuto/lib/mcp-locale/prova.py +93 -0
- package/contenuto/lib/mcp-locale/server/modello_locale.py +167 -0
- package/contenuto/lib/mcp-locale/server/noeva_mcp.py +203 -0
- package/contenuto/lib/modello/consegna.py +134 -0
- package/contenuto/lib/modello/pubblica.py +131 -0
- package/contenuto/lib/snapshot/ascolta.py +213 -0
- package/contenuto/lib/snapshot/impacchetta.py +184 -0
- package/contenuto/lib/snapshot/noeva_snapshot.py +107 -0
- package/contenuto/lib/snapshot/pubblica.py +35 -15
- package/contenuto/lib/snapshot/worker/installa.ps1 +340 -0
- package/core.js +21 -3
- package/modello/repository/github/workflows/ci.yml +53 -3
- package/modello/repository/github/workflows/rilascio-windows.yml +207 -0
- package/modello/repository/gitignore +2 -1
- package/package.json +2 -1
- package/pubblica.js +211 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,54 @@
|
|
|
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.2 — 6 novembre 2026
|
|
7
|
+
|
|
8
|
+
- Su Windows la CLI non partiva: la cartella del pacchetto si ricavava con
|
|
9
|
+
`URL.pathname` (`/D:/...`, quindi `D:\D:\...`). Ora con `fileURLToPath`, che
|
|
10
|
+
decodifica anche gli spazi. `rilascio-windows.yml` si fermava al primo passo.
|
|
11
|
+
|
|
12
|
+
## 0.3.1 — 6 novembre 2026
|
|
13
|
+
|
|
14
|
+
- `analytics pubblica` non segue piu' i redirect: un contenitore senza la rotta
|
|
15
|
+
`/_pagine/` manda al login con un 302, e la 0.3.0 prendeva la pagina di login (200)
|
|
16
|
+
per una pubblicazione riuscita. Ora si ferma e dice che il contenitore va deployato;
|
|
17
|
+
una risposta vale solo se e' il `{ok: true}` del contenitore.
|
|
18
|
+
|
|
19
|
+
## 0.3.0 — 6 novembre 2026
|
|
20
|
+
|
|
21
|
+
Il repository del progetto basta a se stesso (ADR 0005): pubblica pagine e modello e
|
|
22
|
+
rilascia i due eseguibili Windows senza il monorepo.
|
|
23
|
+
|
|
24
|
+
- `analytics pubblica` e `analytics modello` chiedono il biglietto all'API NOEVA con la
|
|
25
|
+
chiave di un membro del workspace (`NOEVA_API_KEY` o `~/.noeva-api-key`) quando il
|
|
26
|
+
segreto del contenitore non c'e'. Serve l'API con il campo `tipo` del biglietto
|
|
27
|
+
(noeva-server-api, `POST /api/analytics/biglietto-dati`).
|
|
28
|
+
- `.github/workflows/ci.yml` (gestito): il job `pubblica` porta online pagine e modello a
|
|
29
|
+
ogni push su `main` che passa la verifica. Si accende con il secret `NOEVA_API_KEY` e
|
|
30
|
+
la variabile `ANALYTICS_PUBBLICA=si`.
|
|
31
|
+
- `.github/workflows/rilascio-windows.yml` (gestito): la cartella MCP per i PC e
|
|
32
|
+
l'eseguibile degli snapshot, costruiti e provati su Windows, e le release nel repository
|
|
33
|
+
del progetto. Le ricette sono nel pacchetto (`contenuto/lib/mcp-locale`,
|
|
34
|
+
`contenuto/lib/snapshot`) e leggono `consegna.yml`, che ora e' la configurazione di
|
|
35
|
+
consegna intera: cliente, connessione senza password, verifiche, trasformazioni.
|
|
36
|
+
- La pubblicazione dei dati (`aggiorna.sh --pubblica`) trova il workspace in
|
|
37
|
+
`analytics.json`: fuori dal monorepo il registro non c'e'.
|
|
38
|
+
- `.gitignore` del modello: `dist/`, dove escono le cartelle Windows.
|
|
39
|
+
|
|
40
|
+
## 0.2.0 — 6 novembre 2026
|
|
41
|
+
|
|
42
|
+
- `analytics pubblica --url <url>`: la `apps/` del commit (HEAD, non il disco) sul
|
|
43
|
+
contenitore, in R2, meno quello che `apps/.assetsignore` esclude (ADR 0005, punto 3).
|
|
44
|
+
`--prova` elenca soltanto. In prova il biglietto si firma col segreto del contenitore
|
|
45
|
+
(`SEGRETO_DATI` o `~/.segreto-dati`); quello rilasciato dall'API NOEVA alla CI non c'e'
|
|
46
|
+
ancora.
|
|
47
|
+
- `analytics modello --url <url>`: il modello del commit (wren_project.yml, relationships.yml,
|
|
48
|
+
models/, knowledge/), con le trasformazioni di `consegna.yml`, compilato come `wren context
|
|
49
|
+
build` e pubblicato su R2 per il servizio locale (ADR 0005, punto 6). Vuole python3 con
|
|
50
|
+
pyyaml e wrenai (il contenitore di sviluppo li ha); `--prova` compila soltanto.
|
|
51
|
+
- `analytics.json` accetta `workspace`: il workspace NOEVA che possiede il progetto, che il
|
|
52
|
+
biglietto nomina.
|
|
53
|
+
|
|
6
54
|
## 0.1.0 — 6 novembre 2026
|
|
7
55
|
|
|
8
56
|
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
|
|
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
|
|
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 @@
|
|
|
1
|
+
3.11
|
|
@@ -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"]
|