@brightkyefoo/codevault
v0.2.1
Published
Exporte le code de tes projets vers https://code-export.brightkyefoo.cm — sauvegarde hors-serveur, consultable en ligne, téléchargeable en zip, visible de toi seul.
Downloads
267
Maintainers
Readme
@brightkyefoo/codevault
Exporte le code source de tes projets vers ton espace privé. Chaque envoi crée un snapshot daté, consultable fichier par fichier dans le navigateur et téléchargeable en zip. Si ta machine ou ton serveur tombe, la dernière version est encore là.
Un snapshot n'est visible que par le compte qui l'a envoyé.
En trois minutes
1. Crée ton compte et récupère ton code
Sur code-export.brightkyefoo.cm,
section « Agent embarqué » de ton espace, tu génères un code du type
A1B2-C3D4-E5F6-G7H8.

2. Installe et branche
npm install @brightkyefoo/codevaultPuis deux lignes dans le fichier de démarrage de ton projet :
import { register } from '@brightkyefoo/codevault'
register('A1B2-C3D4-E5F6-G7H8')C'est tout. Au premier lancement le projet part en entier, puis chaque modification déclenche un envoi.
3. Retrouve ton code en ligne
Chaque projet garde son historique. Le bouton Demander un export déclenche un envoi à distance, sans toucher au terminal.

Et chaque snapshot s'explore fichier par fichier, ou se télécharge en zip.

Ou en ligne de commande
Si tu préfères un export ponctuel, sans rien mettre dans ton code :
npm install -g @brightkyefoo/codevault
codevault login # colle le token affiché sur ton espace
codevault init # crée codevault.json
codevault push -m "avant refonte"Agent embarqué
Deux lignes dans le fichier de démarrage de ton projet suffisent :
import { register } from '@brightkyefoo/codevault'
register('A1B2-C3D4-E5F6-G7H8')Le code se génère sur le dashboard, section Agent embarqué. À partir de là :
- au premier lancement, le projet part en entier ;
- ensuite, chaque salve de modifications déclenche un envoi, cinq secondes après le dernier changement ;
- depuis le dashboard, le bouton Demander un export dépose une demande que l'agent récupère à son prochain sondage.
register() ne lève jamais et ne bloque jamais le démarrage : un code invalide
désactive l'agent avec un avertissement, une panne réseau est signalée une fois
puis retentée. Une sauvegarde qui empêche un service de démarrer serait pire que
pas de sauvegarde.
Ce que le code peut, et ne peut pas
Ce code finit dans ton dépôt Git. Il est donc en écriture seule : il envoie des snapshots, et rien d'autre.
| Action | Code agent | Token API | | --- | --- | --- | | Envoyer un snapshot | oui | oui | | Lister les snapshots | non | oui | | Télécharger une archive | non | oui | | Lire un fichier | non | oui | | Supprimer | non | oui | | Voir l'e-mail du compte | non | oui |
Un code trouvé dans un dépôt public permet au mieux d'ajouter des snapshots inutiles, jamais de lire ton code. Il se révoque en un clic, et les snapshots déjà envoyés restent.
Options
const agent = register('A1B2-C3D4-E5F6-G7H8', {
url: 'https://code-export.brightkyefoo.cm',
project: 'mon-api', // sinon : le nom du dossier ou de codevault.json
watch: true, // défaut : actif hors production
debounceMs: 5000, // silence avant envoi après une modification
pollSeconds: 20, // fréquence de relève des demandes du dashboard
encrypt: true, // chiffrement de bout en bout
passphrase: process.env.CODEVAULT_PASSPHRASE,
silent: false,
onEvent: (event) => console.log(event),
})
await agent.exportNow('avant migration') // export immédiat
agent.stop() // arrête surveillance et sondagePar défaut la surveillance est coupée quand NODE_ENV vaut production : le
code n'y bouge plus, seul le sondage des demandes reste actif. Passer
watch: true la force.
L'agent écrit son état dans .codevault/agent-state.json, avec un .gitignore
à côté. C'est ce fichier qui distingue le premier lancement des suivants, et qui
évite de réenvoyer une archive identique.
Où il ne fonctionne pas
register() lit le disque et surveille des fichiers : il lui faut un vrai
processus Node avec accès au système de fichiers du projet. Il ne fonctionne
donc pas dans un navigateur, ni sur un exécutant de périphérie (Vercel Edge,
Cloudflare Workers), ni dans une fonction sans état dont le code est figé dans
une archive en lecture seule.
Dans ces cas, l'export se fait au moment de la construction ou du déploiement,
avec codevault push dans le job d'intégration continue.
Commandes
| Commande | Rôle |
| --- | --- |
| codevault login | Enregistre l'URL du serveur et le token. |
| codevault logout | Oublie les identifiants (--all pour tous les serveurs). |
| codevault whoami | Affiche le compte connecté. |
| codevault init | Crée codevault.json dans le dossier courant. |
| codevault push | Compresse le projet et l'envoie. |
| codevault list | Liste les snapshots (--all pour tous les projets). |
| codevault pull [id] | Restaure un snapshot. Sans id, le dernier du projet. |
| codevault watch | Envoie un snapshot après chaque salve de modifications. |
| codevault rm <id> | Supprime un snapshot du serveur. |
| codevault decrypt <fichier> | Déchiffre une archive téléchargée depuis le site. |
Options utiles :
codevault push --dry-run # liste ce qui partirait, sans rien envoyer
codevault push --encrypt # chiffre l'archive avant l'envoi
codevault pull <id> --zip # écrit l'archive au lieu de l'extraire
codevault pull <id> --dir ./restore # choisit le dossier de destination
codevault watch --debounce 120 # attend 2 min de calme avant d'envoyerCe qui part, ce qui ne part pas
Le scan applique dans l'ordre :
- une liste d'exclusions permanentes :
node_modules,.git,dist,build,.next,coverage,__pycache__,.venv, caches divers ; - les fichiers de secrets :
.env,.env.*,*.pem,*.key,id_rsa,.npmrc… Les variantes d'exemple (.env.example) restent incluses ; - les règles de ton
.gitignore, y compris ceux des sous-dossiers ; - tes propres motifs
excludeetincludedanscodevault.json.
Les liens symboliques ne sont pas suivis. Les fichiers au-dessus de maxFileSize
(2 Mo par défaut) sont écartés, et le total est plafonné à 100 Mo.
Configuration
codevault.json, à la racine du projet :
{
"project": "mon-projet",
"useGitignore": true,
"exclude": ["docs/captures/**", "*.psd"],
"include": [".env.example"],
"maxFileSize": 2097152,
"encrypt": false,
"url": "https://vault.mondomaine.fr"
}| Clé | Effet |
| --- | --- |
| project | Identifiant du projet côté serveur. Minuscules, chiffres, tirets. |
| useGitignore | Suivre les .gitignore du projet. |
| exclude | Motifs supplémentaires à écarter, syntaxe .gitignore. |
| include | Motifs qui réintègrent un fichier écarté par défaut. |
| maxFileSize | Taille max d'un fichier embarqué, en octets. |
| encrypt | Chiffrer les archives de ce projet. |
| url | Serveur visé, si différent de celui enregistré. |
Chiffrement de bout en bout
Avec --encrypt, l'archive est chiffrée sur ta machine avant l'envoi :
AES-256-GCM, clé dérivée de ta phrase secrète par PBKDF2-SHA256 (210 000 itérations).
Le serveur reçoit un bloc opaque. Il ne connaît ni le contenu, ni les noms de fichiers, seulement leur nombre. Le manifeste voyage à l'intérieur de l'archive.
Pour relire un snapshot chiffré : saisis ta phrase secrète sur le site, le
déchiffrement se fait dans le navigateur, ou passe par codevault pull et
codevault decrypt en local.
Une phrase secrète perdue rend le snapshot définitivement illisible. Il n'y a pas de récupération, c'est ce qui fait la garantie.
Variables d'environnement
Pratiques en intégration continue, où rien n'est interactif :
| Variable | Rôle |
| --- | --- |
| CODEVAULT_TOKEN | Token API, remplace codevault login. |
| CODEVAULT_URL | URL du serveur. |
| CODEVAULT_PASSPHRASE | Phrase secrète de chiffrement. |
| CODEVAULT_HOME | Dossier des identifiants (défaut : ~/.config/codevault). |
Exemple de sauvegarde après un déploiement réussi :
- name: Sauvegarde du code
env:
CODEVAULT_TOKEN: ${{ secrets.CODEVAULT_TOKEN }}
CODEVAULT_URL: https://vault.mondomaine.fr
run: npx @brightkyefoo/codevault push -m "deploy ${{ github.sha }}"API programmatique
import { pushProject, scanProject, loadConfig } from '@brightkyefoo/codevault'
// Vérifier ce qui partirait
const { config, root } = loadConfig(process.cwd())
const scan = scanProject({ root, ...config })
console.log(`${scan.files.length} fichiers, ${scan.totalBytes} octets`)
// Envoyer
const snapshot = await pushProject({ message: 'build de prod' })
console.log(snapshot?.webUrl)Sont aussi exportés ApiClient, buildArchive, extractArchive,
encryptBuffer, decryptBuffer, et les types associés.
Où sont stockés les identifiants
Dans ~/.config/codevault/credentials.json, en 0600, une entrée par serveur.
Le fichier contient le token en clair : c'est un secret de la même nature qu'une
clé SSH. codevault logout l'efface.
Licence
MIT
