Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,6 @@ Thumbs.db

# --- Android: il progetto si genera nella CI (npx cap add android) ---
/android/

# --- Configurazione locale di Claude Code (anteprime) ---
.claude/
40 changes: 20 additions & 20 deletions AGENTS.md

Large diffs are not rendered by default.

10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,11 @@ che i numeri di un'azienda escano dal computer di chi ha il diritto di vederli.
| Cosa fa | Configura, riclassifica, simula scenari | Carica i propri dati, consulta i propri KPI |
| Se salta la rete | Continua a funzionare | Continua a funzionare |

I due programmi si parlano su una rete privata (Tailscale, con un collegamento di
riserva per quando un'azienda non riesce a configurarlo). Nessun server pubblico,
nessun dominio da comprare, nessun dato che passa da terzi per l'uso quotidiano.
I due programmi si parleranno (è il prossimo passo, la fase 8) su un canale privato
e cifrato, senza account da creare: lo studio mostra un codice, l'azienda lo
inserisce. Nessun server pubblico, nessun dominio da comprare, e chi sta in mezzo
vede solo dati cifrati. Oggi il programma Azienda funziona sullo stesso computer
dello studio, con il suo accesso.

## Novità della 1.3.1

Expand Down Expand Up @@ -467,7 +469,7 @@ nell'IndexedDB; Express è un piccolo router compatibile (`src/web/shims/express
e le chiamate `fetch` all'indirizzo del backend restano nella pagina
(`src/web/bridge.ts`). Capacitor la impacchetta in un APK sulla CI di GitHub
(`.github/workflows/android-demo.yml`), a ogni release. Dettagli in
[`AGENTS.md`](./AGENTS.md), versione 1.2.0.
[`AGENTS.md`](./AGENTS.md).

### L'interfaccia (1.3.0)

Expand Down
61 changes: 32 additions & 29 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 7 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"@types/sql.js": "^1.4.11",
"@vitejs/plugin-react": "^5.1.0",
"docx-preview": "^0.4.1",
"electron": "^44.3.0",
"electron": "^44.4.5",
"electron-builder": "^26.0.12",
"electron-vite": "^5.0.0",
"jszip": "^3.10.2",
Expand All @@ -66,6 +66,11 @@
"tailwindcss": "^4.3.3",
"typescript": "^5.9.3",
"vite": "^7.1.0",
"vitest": "^5.0.0"
"vitest": "^5.0.1"
},
"overrides": {
"exceljs": {
"uuid": "^11.1.1"
}
}
}
12 changes: 6 additions & 6 deletions scripts/demo.mjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
/**
* Avvia la build di produzione con il seed dimostrativo attivo
* (account `cammo` e `Pizzeria DaProd`, password `1234`).
* Avvia la build compilata (`out/`) fuori pacchetto, quindi con il seed
* dimostrativo attivo (account `cammo` e `Pizzeria DaProd`, password `1234`).
*
* In `npm run dev` il seed è già attivo di suo: questo script serve solo per
* provare l'app compilata senza passare dal wizard di primo avvio.
* Serve a provare l'app compilata senza passare dal wizard di primo avvio.
* Il seed si accende perché l'app non è impacchettata, non per una variabile
* d'ambiente: un eseguibile vero non lo accende mai (vedi db/seed.ts).
*/
import { spawn } from 'node:child_process'
import electron from 'electron'

spawn(electron, ['.'], {
stdio: 'inherit',
env: { ...process.env, DAPROD_DEMO: '1' }
stdio: 'inherit'
}).on('exit', (code) => process.exit(code ?? 0))
12 changes: 7 additions & 5 deletions src/main/db/seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@ import { saveAppSettings } from '../server/services/settings.service'
* provare i ruoli di AGENTS.md §4 senza passare dal wizard di primo avvio.
*
* ⚠️ Non deve MAI finire in un'installazione reale: sono credenziali note e con
* password fuori policy. Gira solo in sviluppo (`npm run dev`) oppure con
* `DAPROD_DEMO=1` impostata a mano, nella versione demo costruita da
* `npm run dist:demo`, e solo su un database ancora vuoto. La versione demo usa
* una cartella dati tutta sua (vedi build-flags.ts).
* password fuori policy. Gira solo fuori pacchetto (`npm run dev`, `npm run
* demo`) e nella versione demo costruita da `npm run dist:demo`, e solo su un
* database ancora vuoto. La versione demo usa una cartella dati tutta sua (vedi
* build-flags.ts). In un eseguibile vero nessuna variabile d'ambiente lo
* accende: prima bastava `DAPROD_DEMO=1` al primo avvio per ritrovarsi
* `cammo / 1234` in un'installazione reale.
*/
export const DEMO_PASSWORD = '1234'

Expand All @@ -37,7 +39,7 @@ export const DEMO_ACCOUNTS: DemoAccount[] = [
]

export function isDemoMode(): boolean {
return DEMO_BUILD || is.dev || process.env['DAPROD_DEMO'] === '1'
return DEMO_BUILD || is.dev
}

/** true quando il seed è attivo e i dati sono effettivamente presenti. */
Expand Down
2 changes: 1 addition & 1 deletion src/main/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { settingsRouter } from './routes/settings.routes'
* Backend REST embedded nel processo main — AGENTS.md §2/§3.
*
* In Fase 1 ascolta solo su 127.0.0.1 con porta effimera: è la UI locale a
* consumarlo. L'esposizione verso le app Azienda via Tailscale è Fase 8 (§13) —
* consumarlo. L'esposizione verso le app Azienda (canale cifrato, §3) è Fase 8 —
* qui non si apre nulla verso la rete.
*/
const HOST = '127.0.0.1'
Expand Down
22 changes: 17 additions & 5 deletions src/renderer/src/components/StatusBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { applicaZoom, useZoom, ZOOM_MAX, ZOOM_MIN, ZOOM_PASSO } from '../lib/zoo

/**
* Status bar sempre visibile in basso — AGENTS.md §7.
* Tailscale e "ultima sync" restano grigi finché non arriva la Fase 8.
* Collegamento e "ultima sync" restano grigi finché non arriva la Fase 8.
*/
type Tone = 'ok' | 'warn' | 'off'

Expand All @@ -17,9 +17,17 @@ const DOT: Record<Tone, string> = {
off: 'bg-ink-600'
}

function Indicator({ tone, label }: { tone: Tone; label: string }): React.JSX.Element {
function Indicator({
tone,
label,
title
}: {
tone: Tone
label: string
title?: string
}): React.JSX.Element {
return (
<span className="flex items-center gap-1.5">
<span className="flex items-center gap-1.5" title={title}>
<span className={`h-2 w-2 rounded-full ${DOT[tone]}`} />
<span className={tone === 'off' ? 'text-ink-400' : 'text-ink-300'}>{label}</span>
</span>
Expand Down Expand Up @@ -72,8 +80,12 @@ export function StatusBar({ version }: { version: string }): React.JSX.Element {
<Indicator tone={dbTone} label="Database" />
<span className="hidden md:contents">
<Indicator tone={serverTone} label="Server" />
{/* Fase 8: qui comparirà "via Tailscale" o "via fallback" (§7). */}
<Indicator tone="off" label="Tailscale" />
{/* Fase 8: qui comparirà lo stato del canale con le aziende (§3, §7). */}
<Indicator
tone="off"
label="Collegamento"
title="Il collegamento fra studio e aziende arriva con la fase 8."
/>
<span className="text-ink-400">
Ultima sync: {health?.last_sync ?? 'mai sincronizzato'}
</span>
Expand Down