Custom virtual volumes for Node.js, with a keyboard-first terminal file manager.
cli-node-virtual-volumese' un file system virtuale custom, persistente e Node-only, progettato per creare volumi logici separati dalla macchina host e gestirli da una TUI ricca, veloce e orientata alle scorciatoie da tastiera.
Questo progetto nasce per offrire un ambiente di storage virtuale che:
- non monta dischi reali a livello OS
- non espone un file system nativo accessibile da altri programmi
- vive all'interno di un runtime Node.js
- salva ogni volume in un singolo file SQLite
- permette import/export da e verso la macchina host
- offre una UX da terminale curata, con navigator, modali e progress feedback reali
In pratica ottieni volumi virtuali persistenti, con spazio logico configurabile, navigabili come un piccolo file manager in terminale.
- Panoramica
- Funzionalita'
- Architettura
- Installazione
- Avvio rapido
- Configurazione
- Controlli TUI
- Import ed export
- API Node.js
- Sviluppo
- Packaging e release
- Troubleshooting
- Roadmap
- Licenza
| Area | Cosa offre |
|---|---|
| Storage virtuale | Volumi persistenti con struttura file/cartelle custom |
| UX terminale | TUI keyboard-first con frecce, modali, status e progress |
| Integrazione host | Import massivo da host e export verso host |
| Runtime Node-only | Utilizzabile via CLI e via API JavaScript/TypeScript |
| Enterprise quality | Configurazione validata, logging su file, test automatici, packaging npm |
- Creazione e rimozione di volumi virtuali.
- Quota logica configurabile per ogni volume.
- Gestione di cartelle e file in un file system virtuale custom.
- Supporto a move, rename, delete e navigazione gerarchica.
- Preview rapida dei file di testo.
- Persistenza dei contenuti e dei metadata.
- Un file
.sqlitededicato per ogni volume virtuale.
- Dashboard dei volumi.
- Explorer del contenuto del volume.
- Browser del file system host per import ed export.
- Modali dedicate per input, conferma e selezione.
- Inspector contestuale.
- Sidebar con shortcut leggibili e verticali.
- Barra di stato con spinner, progress bar, esito operazioni e contesto.
- Import di singoli file.
- Import di cartelle complete.
- Import massivo con selezione multipla via checkbox.
- Export di file dal volume alla macchina host.
- Export ricorsivo di directory.
- Feedback di avanzamento durante transfer lunghi.
- Transfer di file grandi tramite chunk persistiti in SQLite.
- Verifica di integrita' automatica su import ed export.
- Configurazione via
.env. - Logging strutturato su file.
- Build TypeScript con
tsup. - Test con
vitest. - Linting con
eslint. - Packaging installabile globalmente con npm.
Il progetto e' organizzato per responsabilita', con separazione chiara tra dominio, application layer, storage e UI:
src/
application/ -> orchestration dei casi d'uso
config/ -> env, defaults e validazione config
domain/ -> tipi, DTO e primitive del virtual filesystem
logging/ -> logger Pino e gestione output
storage/ -> repository, blob store e persistenza
ui/ -> terminal shell, browser host, status helpers
utils/ -> helper generici
| Modulo | Ruolo |
|---|---|
VolumeService |
Regola i flussi applicativi di volumi, file, import ed export |
VolumeRepository |
Gestisce metadata e stato dei volumi nel file SQLite del volume |
BlobStore |
Conserva il contenuto reale dei file virtuali nello stesso SQLite del volume |
TerminalApp |
Costruisce la TUI e orchestra la UX runtime |
env config |
Traduce .env, flag CLI e default applicativi |
logger |
Registra eventi, errori e trace su file system |
- Node.js
>= 20 - npm
- terminale con supporto TUI
npm installnpm pack
npm install -g ./cli-node-virtual-volumes-0.3.0.tgzDopo l'installazione globale il comando disponibile e':
virtual-volumesnpm run devnpm run build
npm start- Avvia la TUI.
- Crea un volume.
- Entra nel volume con
EnteroRight. - Importa file/cartelle dal file system host.
- Naviga con le frecce.
- Esporta verso host quando serve.
Il progetto legge la configurazione da .env, flag CLI e default interni. E' disponibile un template in .env.example.
| Variabile | Descrizione |
|---|---|
VOLUME_DATA_DIR |
Root persistente dei volumi virtuali |
VOLUME_LOG_DIR |
Directory dei log runtime |
VOLUME_DEFAULT_QUOTA_BYTES |
Quota di default per i nuovi volumi |
VOLUME_LOG_LEVEL |
Livello log: fatal, error, warn, info, debug, trace, silent |
VOLUME_LOG_TO_STDOUT |
Duplica i log anche sul terminale |
VOLUME_PREVIEW_BYTES |
Dimensione massima preview file |
- Di default i volumi vengono salvati nella directory corrente da cui lanci il programma, a meno che tu non sovrascriva il path via config.
- Dentro
VOLUME_DATA_DIR/volumesogni volume viene persistito come file singolo.sqlite. - I contenuti file grandi vengono salvati a chunk all'interno dello stesso database SQLite del volume.
- I log sono pensati per stare su file; l'output su terminale e' utile in debug, ma puo' interferire con la TUI fullscreen.
La UI e' pensata per essere usata quasi completamente da tastiera.
| Tasto | Azione |
|---|---|
Up / Down |
Cambia selezione |
PageUp / PageDown |
Scorre velocemente |
Home / End |
Primo / ultimo volume |
Right, Enter, O |
Apre il volume selezionato |
N |
Crea un nuovo volume |
X |
Elimina il volume selezionato |
R |
Refresh |
? |
Help |
Q |
Esce |
| Tasto | Azione |
|---|---|
Up / Down |
Cambia selezione |
PageUp / PageDown |
Scorre di pagina |
Home / End |
Primo / ultimo elemento |
Right, Enter |
Entra in cartella o apre preview file |
Left, Backspace, B |
Torna indietro |
C |
Crea cartella |
I |
Apre il browser host per l'import |
E |
Apre il browser host per l'export |
M |
Move / rename |
D |
Delete |
P |
Preview |
R |
Refresh |
? |
Help |
| Tasto | Azione |
|---|---|
Up / Down |
Cambia selezione |
Right |
Entra in cartella o drive |
Left |
Risale alla cartella padre |
Space |
Seleziona o deseleziona checkbox |
A |
Seleziona o deseleziona gli elementi visibili |
Enter, I |
Conferma l'import |
Esc, Q |
Chiude la modale |
| Tasto | Azione |
|---|---|
Up / Down |
Cambia selezione |
Right |
Entra in cartella o drive |
Left |
Risale alla cartella padre |
Enter, E |
Esporta nella cartella corrente |
Esc, Q |
Chiude la modale |
L'import non richiede di digitare manualmente un path host:
- apri la modale import con
I - navighi il file system host con le frecce
- selezioni piu' file o directory con
Space - confermi con
EnteroI
Durante l'operazione la status area mostra:
- operazione attiva
- spinner
- progress bar
- messaggio contestuale
- esito finale
SUCCESSoERROR - verifica di integrita' sui file importati
L'export funziona in modo speculare:
- selezioni il file o la cartella nel volume virtuale
- premi
E - scegli la destinazione host
- confermi l'operazione
L'export supporta sia file singoli sia directory ricorsive. Al termine dell'export viene eseguita anche una verifica di integrita' del file scritto sulla macchina host.
Oltre alla TUI, il progetto espone una API utilizzabile da codice:
import { createRuntime } from 'cli-node-virtual-volumes';
const runtime = await createRuntime({
dataDir: 'C:/cli-node-virtual-volumes/data',
logLevel: 'info'
});
const volume = await runtime.volumeService.createVolume({
name: 'Secure Docs'
});
await runtime.volumeService.writeTextFile(
volume.id,
'/hello.txt',
'ciao dal filesystem virtuale'
);
const preview = await runtime.volumeService.previewFile(volume.id, '/hello.txt');
console.log(preview.content);| Script | Descrizione |
|---|---|
npm run dev |
Avvia la CLI in sviluppo |
npm run build |
Compila il progetto |
npm run start |
Esegue la build compilata |
npm run lint |
Esegue ESLint |
npm run typecheck |
Esegue TypeScript in modalita' no emit |
npm run test |
Esegue i test con coverage |
npm run verify |
Esegue verifiche complete |
npm run pack:local |
Genera il tarball npm locale |
La codebase punta a una struttura pulita e mantenibile:
- TypeScript tipizzato end-to-end
- moduli separati per responsabilita'
- test su casi core e regressioni
- tooling npm allineato al packaging reale
Il pacchetto e' pensato per essere distribuito via npm o come tarball:
npm run pack:localOutput atteso:
- file
.tgzdel pacchetto - build
dist/ - metadata completi per installazione globale
Le release locali possono essere accompagnate da:
CHANGELOG.md- commit in stile Conventional Commits
- workflow GitHub Actions per build e publish artefatti
npm run lint
npm run typecheck
npm run test
npm run verifyLa suite copre:
- virtual filesystem core
- import massivo e export
- progress callback
- parsing env
- logica di navigazione TUI
- regressioni su modali e workflow principali
- evita
VOLUME_LOG_TO_STDOUT=truedurante l'uso fullscreen - usa un terminale con supporto completo alle escape sequence
- verifica di essere su Node.js 20 o superiore
- file molto grandi mostrano progress avanzato, ma possono comunque richiedere tempo
- verifica la velocita' del disco host e la dimensione dei transfer
- controlla
VOLUME_DATA_DIR - se non impostato, usa la directory corrente da cui hai lanciato il comando
- miglioramento continuo della shell TUI
- ulteriore riduzione dei crash e delle condizioni di freeze
- affinamento delle release automation
- evoluzione del backend di persistenza per scenari ancora piu' grandi
Creato e mantenuto da Salvatore Scarano.
Questo progetto e' distribuito con licenza MIT.
