npm package: @john-heshima/yalc-plus
Description: Local package workflow with immutable store and hardlinks
Latest version: 0.2.0

# yalc-plus

Avec yalc, on se heurte vite aux lenteurs liées aux copies répétées de gros dossiers, aux limites des symlinks dans certains environnements (ex. Metro/React Native), et au manque de traçabilité fine des révisions installées. yalc-plus reprend l'idée du workflow local mais la pousse plus loin : il publie des révisions immuables dans un store dédié, installe via hardlinks quand c'est possible (ou copie sinon), et rend les mises à jour plus rapides, plus fiables et plus prévisibles.

## En une phrase

`yalc-plus` remplace le cycle pénible "build → publier → réinstaller" par un flux local rapide, fiable et reproductible, idéal pour itérer sur une librairie et la consommer dans plusieurs apps sans repacker tout le projet à chaque fois.

## Pourquoi l'utiliser

- Accélère les boucles de dev en évitant des copies intégrales de dossiers volumineux.
- Garantit des révisions immuables, donc des installs reproductibles et traçables.
- Évite les problèmes de symlinks et de bundlers (React Native/Metro) en installant des fichiers normaux.
- Fonctionne bien en monorepo comme en multi-repos.

## Comment ça marche (concepts clés)

- **Store immuable** : chaque publication locale crée une révision stockée dans `~/.yalc-plus`.
- **Hardlinks quand possible** : si le store et l'app sont sur le même device, l'installation utilise des hardlinks (ultra rapide et sans duplication réelle).
- **Fallback automatique** : si le hardlink n'est pas possible, `yalc-plus` copie les fichiers.
- **Traçabilité** : chaque app reçoit un `yalc-plus.lock` pour savoir exactement quelle révision est installée.
- **Détection Metro** : un fichier `.yalc-plus-stamp` est touché pour forcer la détection de changements.

## Installation

```bash
npm i -g @john-heshima/yalc-plus
# ou
npx yalc-plus --help
```

## Workflow rapide

```bash
# Dans la lib
yalc-plus publish --push

# Dans l'app
yalc-plus add <pkg>

# Retour dans la lib
yalc-plus watch --push
```

## Commandes

- `yalc-plus doctor`
- `yalc-plus publish [--package <path>] [--no-build] [--push] [--apps <globs>]`
- `yalc-plus add <pkgName> [--app <path>] [--link-mode hardlink|copy]`
- `yalc-plus push <pkgName> [--apps <paths>] [--all]`
- `yalc-plus remove <pkgName> [--app <path>] [--clean]`
- `yalc-plus watch [--package <path>] [--apps <paths>] [--debounce <ms>]`
- `yalc-plus packlist`

## Différences avec yalc (détaillé)

- **Store immuable par révision** : chaque `publish` crée une révision unique, immuable et traçable. Cela évite les états flous où un même package "change" sur place.
- **Fichiers normaux (pas de symlinks)** : l'installation se fait via hardlinks ou copies réelles, ce qui réduit les soucis avec des outils sensibles aux symlinks (ex. Metro).
- **Optimisation des gros packages** : grâce aux hardlinks, un package volumineux n'est pas recopié entièrement à chaque fois, ce qui réduit drastiquement le temps d'installation et l'usage disque.
- **Compatibilité device-aware** : si le store et le projet ne sont pas sur le même device, `yalc-plus` bascule automatiquement en mode copie.
- **Signaux de changement** : le `.yalc-plus-stamp` facilite la détection de modifications côté bundler, évitant des redémarrages manuels trop fréquents.

## Dépannage Metro

Après des updates, Metro peut nécessiter un reset de cache:

```bash
expo start --clear
# ou
npx react-native start --reset-cache
```

`yalc-plus` touche `node_modules/<pkg>/.yalc-plus-stamp` pour aider Metro à détecter les changements.

## Notes

- `yalc-plus.lock` est écrit dans chaque app pour tracer les packages et révisions installés.
- Les hardlinks ne sont utilisés que si le store et l'app sont sur le même device.